上一页 1 2 3 4 5 6 ··· 9 下一页
摘要: 多重继承是一种比较复杂的继承关系,它意味着如果用户想要使用这个类,那么就要对它的父类也了如指掌,所以在项目中会带来可读性的问题,一般我们都会尽量选择用单继承去替代它。使用多重继承过程容易碰到的问题就是名字冲突,像下面这样: 1 class Base1 2 { 3 public: 4 void fun(){} 5 }; 6 7 class Base2 8 { 9 private:10 void fun(){}11 };12 13 class Derived : public Base1, public Base214 {};15 16 int main()17 {18 ... 阅读全文
posted @ 2014-03-18 00:03 Jerry19880126 阅读(1313) 评论(0) 推荐(0) 编辑
摘要: private继承的意义在于“be implemented in turns of”,这个与上一条款中说的复合模型的第二层含义是相同的,这也意味着通常我们可以在这两种设计方法之间转换,但书上还是更提倡使用复合来进行类的设计。private继承与public的继承是完全不同的,主要体现在两个地方:其一,public继承在子类中保持父类的访问权限,即父类中是public的成员函数或成员变量,在子类中仍是public,对private或者protected的成员函数或成员变量亦是如此;但private继承则不是这样了,它破坏了父类中的访问权限标定,将之都转成private,这对子类本身并无影响(照常 阅读全文
posted @ 2014-03-15 14:50 Jerry19880126 阅读(1875) 评论(1) 推荐(0) 编辑
摘要: 如果说public是一种is-a的关系的话,那么复合就是has-a的关系。直观来说,复合就是在一个类中采用其他类的对象作为自身的成员变量,可以举个例子,像下面这样:1 class Person2 {3 private:4 string Name; // 复合string类型的变量5 PhoneNumber HomeNumber; // 复合PhoneNumber对象6 PhoneNumber TelephoneNumber;7 };我们一般会说人有名字,有家庭电话,有手机电话等,但我们一般不会说人是一个名字,或者人是一个家庭电话等。所以在这里,我们并不会去使用publi... 阅读全文
posted @ 2014-03-15 00:11 Jerry19880126 阅读(1300) 评论(0) 推荐(0) 编辑
摘要: 先看下面的例子: 1 enum MyColor 2 { 3 RED, 4 GREEN, 5 BLUE, 6 }; 7 8 class Shape 9 {10 public:11 void virtual Draw(MyColor color = RED) const = 0;12 };13 14 class Rectangle: public Shape15 {16 public:17 void Draw(MyColor color = GREEN) const18 {19 cout Draw() = "; // ?38 ... 阅读全文
posted @ 2014-03-13 23:51 Jerry19880126 阅读(1045) 评论(0) 推荐(0) 编辑
摘要: 这个条款的内容很简单,见下面的示例: 1 class BaseClass 2 { 3 public: 4 void NonVirtualFunction() 5 { 6 cout NonVirtualFunction(); // 输出BaseClass::NonVirtualFunction25 dp->NonVirtualFunction(); // 输出DerivedClass::NonVirtualFunction26 }从输出结果可以看到一个有趣的现象,那就是两者都是通过相同的对象d调用成员函数NonVirutalFunction,但显示结果却不... 阅读全文
posted @ 2014-03-13 00:03 Jerry19880126 阅读(1164) 评论(0) 推荐(0) 编辑
摘要: 举书上的例子,考虑一个virtual函数的应用实例: 1 class GameCharacter 2 { 3 private: 4 int BaseHealth; 5 public: 6 virtual int GetHealthValue() const // 返回游戏人物的血量 7 { 8 return BaseHealth; 9 }10 11 int GetBaseHealth() const12 {13 return BaseHealth;14 }15 };16 17 class KnightBo... 阅读全文
posted @ 2014-03-12 00:09 Jerry19880126 阅读(1446) 评论(0) 推荐(0) 编辑
摘要: 这个条款书上内容说的篇幅比较多,但其实思想并不复杂。只要能理解三句话即可,第一句话是:纯虚函数只继承接口;第二句话是:虚函数既继承接口,也提供了一份默认实现;第三句话是:普通函数既继承接口,也强制继承实现。这里假定讨论的成员函数都是public的。这里回顾一下这三类函数,如下:1 class BaseClass2 {3 public:4 void virtual PureVirtualFunction() = 0; // 纯虚函数5 void virtual ImpureVirtualFunction(); // 虚函数6 void CommonFunciton(); ... 阅读全文
posted @ 2014-03-10 23:24 Jerry19880126 阅读(1736) 评论(1) 推荐(3) 编辑
摘要: 名称的遮掩可以分成变量的遮掩与函数的遮掩两类,本质都是名字的查找方式导致的,当编译器要去查找一个名字时,它一旦找到一个相符的名字,就不会再往下去找了,因此遮掩本质上是优先查找哪个名字的问题。而查找是分作用域的,虽然本条款的命名是打着“继承”的旗子来说的,但我觉得其实与继承并不是很有关系,关键是作用域。举例子说明这个问题会比较好理解。1 //例1:普通变量遮掩2 int i = 3;3 4 int main()5 {6 int i = 4;7 cout << i << endl; // 输出48 }这是一个局部变量遮掩全局变量的例子,编译器在查找名字时,优先查找的是局部变 阅读全文
posted @ 2014-02-22 22:37 Jerry19880126 阅读(1374) 评论(1) 推荐(2) 编辑
摘要: 这一条款是说的是公有继承的逻辑,如果使用继承,而且继承是公有继承的话,一定要确保子类是一种父类(is-a关系)。这种逻辑可能与生活中的常理不相符,比如企鹅是生蛋的,所有企鹅是鸟类的一种,直观来看,我们可以用公有继承描述: 1 class Bird 2 { 3 public: 4 virtual void fly(){cout << "it can fly." << endl;} 5 }; 6 7 class Penguin: public Bird 8 { 9 // fly()被继承过来了,可以覆写一个企鹅的fly()方法,也可以直接用父类的10 } 阅读全文
posted @ 2014-02-19 22:15 Jerry19880126 阅读(1110) 评论(0) 推荐(2) 编辑
摘要: 下面来谈谈书中的第二部分,用Interface Classes来降低编译的依赖。从上面也可以看出,避免重编的诀窍就是保持头文件(接口)不变化,而保持接口不变化的诀窍就是不在里面声明编译器需要知道大小的变量,Handler Classes的处理就是把变量换成变量的地址(指针),头文件只有class xxx的声明,而在cpp里面才包含xxx的头文件。Interface Classes则是利用继承关系和多态的特性,在父类里面只包含成员方法(成员函数),而没有成员变量,像这样: 1 // Person.h 2 #include 3 using namespace std; 4 5 class My.. 阅读全文
posted @ 2014-02-16 22:13 Jerry19880126 阅读(1537) 评论(1) 推荐(3) 编辑
上一页 1 2 3 4 5 6 ··· 9 下一页