请考虑下面的示例代码:
#include <iostream>
using namespace std;
class base
{
public:
base()
{
cout << "ctor in base class\n";
}
};
class derived1 : public base
{
public:
derived1()
{
cout <<"ctor in derived1 class\n";
}
};
class derived2 : public derived1
{
public:
derived2() : base()
{
cout << "ctor in derived2 class\n";
}
};
int main()
{
derived2 d2obj;
return 0;
}
这给出了错误:
错误:类型“base”不是“衍生2”的直接基础
为什么会出现这个错误?如果我将基类设为虚拟,错误就不再存在。这是什么原因呢?
Because base
不是直接基础derived2
。你必须为你的直接基础提供一个构造函数,derived1
在这种情况下。
虚拟基地是个例外。它们始终在叶类中初始化,否则您可能会对同一基类进行多个构造函数调用。所以如果你做base
virtual,不仅可以在中初始化它derived2
, 你必须。
当您的派生图不是树时,就会出现问题。IBM http://publib.boulder.ibm.com/infocenter/lnxpcomp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7l.doc%2Flanguage%2Fref%2Fclrc14cplr135.htm有一张漂亮的图画。如果你不做基础(V
在示例中)虚拟(无处不在)您将拥有多个副本。如果你确实让它在任何地方都是虚拟的,那么你将只有一份副本,但是直接子级不能运行构造函数(它将运行> 1次),而叶类必须运行。想了解更多详情,最好去网上搜索一下。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)