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

304

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


17
如果C++有虚构造函数,你会如何使用它们? - R Sahu
11
虚函数有助于动态绑定,这发生在运行时。对象是在运行时创建的,对象的创建需要构造函数。如果这个构造函数是虚拟的,那么会出现“狗追尾巴”的情况(狗代表可怜的编译器 :p)。 - gawkface
2
@RSahu:很可能,请求在C++中使用虚构造函数的人心中有一个想法,即它是一个复制构造函数,并且将根据复制构造函数的参数动态调用。这是有逻辑意义的,但是C++无法处理通过不是指针的实例进行虚拟分派,也不能处理暗示动态堆栈(或更糟的静态)内存的情况。 - Joshua
23个回答

1
如果你逻辑地思考构造函数的工作方式以及虚函数在C++中的含义和用法,那么你会意识到在C++中声明虚构造函数是没有意义的。在C++中声明某个东西为虚函数意味着它可以被当前类的子类覆盖,然而构造函数是在对象创建时调用的,在那个时候你不能创建类的子类,你必须创建类,因此永远不需要声明构造函数为虚函数。
另一个原因是,构造函数与其类名相同,如果我们将构造函数声明为虚函数,那么它应该在其派生类中重新定义相同的名称,但是你不能有两个类具有相同的名称。所以无法拥有虚构造函数。

2
构造函数没有名称。它们具有特定的语法,使用类的名称。 - curiousguy
1
构造函数与其类名相同,如果我们将构造函数声明为虚拟的,则应在派生类中重新定义具有相同名称的构造函数,但是您不能拥有两个类的相同名称。因此,不可能有虚拟构造函数。这是完全错误的。如果是同样的情况,那么析构函数如何成为虚拟的呢?我们没有在派生类中重新定义基本析构函数。 - kadina

1

"构造函数不能是虚函数"

  • 有一些合理的理由可以证明这个说法。
  1. 为了创建一个对象,对象类的构造函数必须与类的类型相同。但是,使用虚拟实现的构造函数是不可能做到的。
  2. 在调用构造函数时,虚表 尚未创建,无法解析任何虚函数调用。因此,虚拟构造函数本身将无处查找。

作为结果,不能声明构造函数为虚拟的。

0
Vpointer是在对象创建时创建的。在对象创建之前,vpointer不存在。因此,将构造函数声明为虚拟没有任何意义。

vptr是一种实现细节,它实现了动态类型的概念。ctor提供了一个动态类型,创建了一个多态对象。 - curiousguy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接