在其中一个C++ tutorials in internet中,我找到了以下关于构造函数不能为虚的原因的描述
我们无法声明虚拟构造函数。我们应该指明确切的 编译时对象的类型,以便编译器可以分配 该特定类型的内存。
这种描述是否正确?
我特别对这句话感到困惑:so that the compiler can allocate
memory for that specific type
。
答案 0 :(得分:19)
Bjarne自己解释 here
虚拟调用是一种在给定部分信息的情况下完成工作的机制。特别是,“virtual”允许我们调用只知道接口而不是对象的确切类型的函数。要创建对象,您需要完整的信息。特别是,您需要知道要创建的内容的确切类型。因此,“对构造函数的调用”不能是虚拟的。
答案 1 :(得分:3)
构造函数不能是虚拟的,因为标准是这样说的。
标准是这样说的,因为它没有意义。虚构造函数会做什么?
虚方法用于多态...如果你还没有这些对象,多态如何工作呢?
我们应该在编译时指定对象的确切类型,所以 编译器可以为该特定类型分配内存。
我们应该在编译时指定确切的类型,因为我们想要一个这种类型的对象......我发现它们的描述也很混乱。
此外,在该段落中并未说明这就是构造函数不能虚拟的原因。它解释了为什么不应该从构造函数中调用虚方法,而是关于它。
答案 2 :(得分:1)
这是正确的,即使它在我的拙见中忽略了这一点。
构造函数设置虚拟调度,即将右指针指向当前类的函数。如果构造函数可以是虚拟的,谁会预先设置虚拟构造函数?会有一个可怕的鸡蛋问题。
然而,有一个名为“虚构造函数”的习语,其中该类的静态成员返回一个具有合适类的基类指针:
class A {
static A* create();
virtual ~A();
};
class B : public A { ... };
A* A::create() { return new B(); }
答案 3 :(得分:1)
构造函数如何成为virtual
? virtual
表示调用该函数的结果由对象的动态类型决定。在施工之前,没有任何目的可以做到这一点。
教程短语的方式,构造函数是什么,也是假的。您需要指定确切的类型,否则您声明的内容不会被视为构造函数,并且不允许返回类型的函数。
答案 4 :(得分:1)
只是添加到已经说过的内容,有虚拟构造函数设计模式,也称为factory method或工厂函数:
...它处理创建对象(产品)的问题,而没有指定将要创建的对象的确切类