请考虑以下示例代码:
#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'不是`derived2'的直接基础
为什么会出现此错误?如果我将基类设为虚拟,则错误不再存在。这是什么原因?
答案 0 :(得分:7)
因为base
不是derived2
的直接基础。在这种情况下,您必须为直接基础derived1
提供构造函数。
虚拟基地是例外。它们总是在叶类中初始化,否则可能会为同一个基础获得多个构造函数调用。因此,如果您将base
设为虚拟,则不仅可以在derived2
中对其进行初始化,而且必须。{/ p>
如果您的派生图不是树,则会出现此问题。 IBM有一幅漂亮的照片。如果您不在虚拟(无处不在)的基础上(示例中为V
),您将拥有多个副本。如果你确实在任何地方虚拟化,你只会有一个副本,但直接子节点不能运行构造函数(它将运行&gt; 1次),叶类必须。有关详细信息,最好搜索网络。
答案 1 :(得分:2)
更改
class derived2 : public derived1
{
public:
derived2() : base()
{
cout << "ctor in derived2 class\n";
}
};
到
class derived2 : public derived1
{
public:
derived2() : derived1()
{
cout << "ctor in derived2 class\n";
}
};
这是因为你试图从一个大孩子 derived2 调用 base1 构造函数。
答案 2 :(得分:0)
你们之间有衍生1。您只能在初始化列表中调用直接父母