【发布时间】:2011-04-18 18:12:35
【问题描述】:
我知道以前有人问过这个问题,但我不明白其他答案中使用的复杂技术词汇。
我在一个社区上读到构造函数不能是虚拟的原因是
“虚拟”机制适用于逻辑完整(完全构造)的对象。我们知道我们使用构造函数来逻辑地初始化我们的对象。换句话说,直到构造函数完成执行,对象才被完全构造。因此,我们不能有虚拟构造函数。
有一种误解,认为到那时虚拟表是不完整的,所以我们不能有虚拟构造函数。就在构造函数开始执行之前,虚拟表已正确构造,并将“this”指针传递给构造函数。此外,虚拟表机制是依赖于实现的,在 C++ 标准中找不到位置。因此,使用虚拟表概念来争论这个问题是不合逻辑的。
现在,随着构造函数完成执行,任何其他函数都可以是虚拟的。析构函数也不例外,因为它是一个函数。如果我们使用基类指针来引用派生类对象,使用它,然后删除它,则需要虚拟析构函数。如果我们有虚拟析构函数,使用“delete”,就会调用从派生到基的一系列析构函数。但是,如果析构函数中没有“虚拟”,则只会调用基类析构函数(而不是派生的)。这(可能)会在程序中产生不一致。
上述理由正确吗?答案没有谈到对象的静态和动态类型。
【问题讨论】:
标签: c++ constructor virtual