为什么我们在C ++中没有虚拟构造函数?

为什么C ++没有虚拟构造函数?


从马的嘴里听到:)。

来自Bjarne Stroustrup的C ++风格和技巧常见问题为什么我们没有虚拟构造函数?

虚拟呼叫是在部分信息下完成工作的机制。 特别是,“虚拟”允许我们调用一个只知道任何接口的函数,而不知道对象的确切类型。 要创建一个对象,你需要完整的信息。 特别是,您需要知道您想要创建的确切类型。 因此,“调用构造函数”不能是虚拟的。

常见问题解答条目继续给出代码,以便在不使用虚拟构造函数的情况下实现此目的。


虚函数基本上提供多态行为。 也就是说,当您使用动态类型与引用它的静态(编译时)类型不同的对象时,它提供的行为适合实际类型的对象而不是对象的静态类型。

现在尝试将这种行为应用于构造函数。 当你构造一个对象时,静态类型总是与实际对象类型相同,因为:

要构造一个对象,构造函数需要它要创建的对象的确切类型[...]此外,您不能有指向构造函数的指针

(Bjarne Stroustup(P424 The C ++ Programming Language SE))


与面向对象的语言(如Smalltalk或Python)不同,其中构造函数是代表类的对象的虚拟方法(这意味着您不需要GoF抽象工厂模式,因为您可以传递代表类的对象而不是你自己的),C ++是一个基于类的语言,并没有表示任何语言结构的对象。 该类在运行时不作为对象存在,因此您无法在其上调用虚拟方法。

这符合'你不支付你不使用'的理念,尽管我见过的每一个大型C ++项目最终都实现了某种形式的抽象工厂或反思。

链接地址: http://www.djcxy.com/p/54153.html

上一篇: Why do we not have a virtual constructor in C++?

下一篇: Can I call a base class's virtual function if I'm overriding it?