荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Dreamer (我与萤火虫), 信区: SoftDev
标  题: 【C++】[FAQ]C++中为何没有虚拟构造函数?
发信站: 荔园晨风BBS站 (Tue Jun  8 13:41:02 2004), 站内信件


Q: C++中为何没有虚拟构造函数?
A: 虚拟机制的设计目的是使程序员在不完全了解细节(比如只知该类实现了某个
界面,而不知该类确切是什么东东)的情况下也能使用对象。但是,要建立一个对
象,可不能只知道“这大体上是什么”就完事——你必须完全了解全部细节,清楚
地知道你要建立的对象是究竟什么。所以,构造函数当然不能是虚的了。

不过有时在建立对象时也需要一定的间接性,这就需要用点技巧来实现了。(详见
《The C++ Programming Language》,第三版,15.6.2)这样的技巧有时也被称作
“虚拟构造函数”。我这里举个使用抽象类来“虚拟构造对象”的例子:
struct F { // interface to object creation functions
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(); // make an A of the appropriate type
B* q = fac.make_a_B(); // make a B of the appropriate type
// ...
}

struct FX : F {
A* make_an_A() const { return new AX(); } // AX is derived from A
B* make_a_B() const { return new BX(); } // BX is derived from B

};

struct FY : F {
A* make_an_A() const { return new AY(); } // AY is derived from A
B* make_a_B() const { return new BY(); } // BY is derived from B

};

int main()
{
user(FX()); // this user makes AXs and BXs
user(FY()); // this user makes AYs and BYs
// ...
}


看明白了没有?上述代码其实运用了Factory模式的一个变体。关键之处是,
user()被完全孤立开了——它对AX,AY这些类一无所知。(嘿嘿,有时无知有无知
的好处 ^_^)





--
如果你真的爱萤火虫,你就不应该将她困在瓶子里;
如果你真的爱萤火虫,你应该放开她,让她在天空中自由自在地飞!
虽然你会不舍得她,但是最终你就会明白这样你才真正拥有了她!

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.223]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店