我们知道构造函数有一个必须遵守的规则,即构造函数不能定义为虚函数。但有一个具体的应用是要求是在不同的场景下通过一个指针或者引用生成不同的对象,这就类似于类型的动态生成,即在执行期才能确定具体的对象。这怎么实现呢?
下面我们介绍两种方法:
1.不管是在effective c++ 还是在设计模式中,提到的一种特别的替代继承的方法,即组合。采用组合的方法来实现构造函数虚化的功能。具体实现方式为:
class base {
//抽象基类,其中至少含有一个纯虚函数,但其构造函数非虚
public:
....
};
class derive1:public base {
public:
....
};
class derive1:public base {
//没有内含任何纯虚函数
public:
....
};
class derive2:public base {
//没有内含任何纯虚函数
public:
....
};
class object {
public:
...
private:
list<base*> components;
};
在上面的代码中,class object含有一个list对象用来装载base类对象,但是由于base类是一个抽象类,所以list中得内容实际为derive1或者为derive2对象,实现了动态产生对象。
在object类的实现函数还有注意下面的代码: