【1】什么是简单工厂模式?核心思想:用一个工厂来根据输入的条件产生不同的类,然后根据不同类的virtual函数得到不同的结果。理解:根据条件生成不同的实例。利用多态的特性,调用同名方法,不同的实例将得到不同的结果。【2】代码示例如下:代码如下: 1 #include 2 #include ...
分类:
其他好文 时间:
2014-08-26 22:37:36
阅读次数:
307
1、当在一个子类当中调用构造函数,其父类构造函数肯定先被调用。如果此时父类构造函数中有一个virtual函数,子类当中也有,肯定执行父类当中的virtual函数,而此时子类当中的成员变量并未被初始化,所以无法调用子类与之对应的函数。即为指向虚函数表的指针vptr没被初始化又怎么去调用派生类的virt...
分类:
编程语言 时间:
2014-08-16 10:59:50
阅读次数:
248
1.是不是一个父类写了一个virtual函数,如果子类覆盖它的函数不加virtual,也能实现多态?virtual修饰符会被隐形继承的。private也被集成,只事派生类没有访问权限而已。virtual可加可不加。子类的空间里有父类的所有变量(static除外)。同一个函数只存在一个实体(inlin...
分类:
编程语言 时间:
2014-08-12 18:27:24
阅读次数:
319
聚合类聚合类使得用户可以直接访问其成员,并且具有特殊的初始化语法形式。当一个类满足如下条件时,我们说它是聚合的:所有成员都是public的没有定义任何构造函数没有类内初始化没有基类,也没用virtual函数。下面的类都是一个聚合类struct Data{ int ival; string s;}.....
分类:
其他好文 时间:
2014-08-09 21:04:49
阅读次数:
237
因为又一次定义继承而来的non-virtual函数是不对的(见上一个条款),所以这个条款就将问题局限于:绝不又一次定义继承一个带有缺省參数值的virtual函数。(一)virtual函数是动态绑定的,而缺省參数却是静态绑定。对象的所谓静态类型,是它在程序中被声明时所採用的类型。你可能会在“调用一个定...
分类:
编程语言 时间:
2014-07-21 14:24:06
阅读次数:
218
经验:private 继承意味 is-implemented-in-terms of。它通常比 composition 的级别低。
但是当 derived class 需要访问 protected base class 的成员,或需要重新定义继承而来的 virtual 函数时,这么设计是合理的
经验:和 composition 不同, private 继承可以造成 empty base 最优化。这对致力于“对象尺寸最小化”的程序库开发者而言,可能很重要
示例1:虽是 Empty class,但却不仅要花...
分类:
编程语言 时间:
2014-07-15 22:41:05
阅读次数:
284
1.virtual 函数版本
class GameCharacter{
public:
virtual int healthValue() const; //返回人物的健康指数, derived classes 可重新定义它
};
2.使用 non-virtual interface 手法,那是 Template Method 设计模式的一种特殊形式。
让客户通过 public non-virtual 成员函数间接调用 private virtual 函数
class GameCharacter{
pu...
分类:
编程语言 时间:
2014-07-15 22:36:18
阅读次数:
364
经验:class 和 templates 都支持接口和多态。
对 classes 而言接口是显式的,以函数签名为中心。多态则是通过 virtual 函数发生于运行期
对 templates 参数而言,接口是隐式的,奠基于有效表达式。多态则是通过 templates 具体化和函数重载解析(function overloading resolution)发生于编译期。
示例1:显式接口和运行期多态
class Widget{
public:
Widget();
virtual ~Widget();
vir...
分类:
编程语言 时间:
2014-07-14 12:54:57
阅读次数:
195
经验:绝对不要重新而来的缺省参数值,因为缺省参数值都是静态绑定,而 virtual 函数 -- 你唯一应该覆写的东西 -- 却是动态绑定
示例:
class Shape{
public:
enum ShapeColor {Red, Green, Blue};
virtual void draw(ShapeColor color = Red) const = 0;
};
class Rectangle: public Shape{
public:
virtual void draw(ShapeColor...
分类:
编程语言 时间:
2014-07-12 21:22:15
阅读次数:
278
经验:绝对不要重新定义继承而来的 non-virtual 函数 --> Item 7 "为多态基类声明 virtual 析构函数" 是本条款的特例
示例:
class B{
public:
void mf();
//...
};
class D: public B{
public:
void mf(); // 遮掩了B::mf,Item 33 名称遮掩规则
}
D x;
B *pB = &x;
D *pD = &x;
pB->mf(); // 调用 B::mf
pD->mf(); // 调用 ...
分类:
编程语言 时间:
2014-07-12 19:09:10
阅读次数:
234