C++中的构造函数不可能是虚拟的,所谓的“虚拟”构造函数更接近一种设计模式:工厂模式。
转自:http://www.weixueyuan.net/view/2810.html
当要求建立一个对象时,一种间接的技术常常被当作“虚拟构造函数”来使用。
下面这个例子展示一种机制:如何使用一个抽象类来建立一个适当类型的对象。
struct F { // 对象建立函数的接口
virtual A* make_an_A() const = 0;
virtual B* make_a_B() const = 0;
};
void user(const F& fac){
A* p = fac.make_an_A(); // 将A 作为合适的类型
B* q = fac.make_a_B(); // 将B 作为合适的类型
// ...
}
struct FX : F {
A* make_an_A() const { return new AX(); } // AX 是A 的派生
B* make_a_B() const { return new BX(); } // AX 是B 的派生
};
struct FY : F {
A* make_an_A() const { return new AY(); } // AY 是A 的派生
B* make_a_B() const { return new BY(); } // BY 是B 的派生
};
int main(){
user(FX()); // 此用户建立AX 与BX
user(FY()); // 此用户建立AY 与BY
// ...
}
这是所谓的“工厂模式”(the factory pattern)的一个变形。关键在于,user 函数与AX 或AY 这样的类的信息被完全分离开来了。
下面这个例子展示一种机制:如何使用一个抽象类来建立一个适当类型的对象。
struct F { // 对象建立函数的接口
virtual A* make_an_A() const = 0;
virtual B* make_a_B() const = 0;
};
void user(const F& fac){
A* p = fac.make_an_A(); // 将A 作为合适的类型
B* q = fac.make_a_B(); // 将B 作为合适的类型
// ...
}
struct FX : F {
A* make_an_A() const { return new AX(); } // AX 是A 的派生
B* make_a_B() const { return new BX(); } // AX 是B 的派生
};
struct FY : F {
A* make_an_A() const { return new AY(); } // AY 是A 的派生
B* make_a_B() const { return new BY(); } // BY 是B 的派生
};
int main(){
user(FX()); // 此用户建立AX 与BX
user(FY()); // 此用户建立AY 与BY
// ...
}
这是所谓的“工厂模式”(the factory pattern)的一个变形。关键在于,user 函数与AX 或AY 这样的类的信息被完全分离开来了。