添加虚拟删除错误:类型'base'不是派生类的直接基础

时间:2011-12-07 16:49:14

标签: c++ inheritance derived-class base-class

请考虑以下示例代码:

#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'的直接基础

为什么会出现此错误?如果我将基类设为虚拟,则错误不再存在。这是什么原因?

3 个答案:

答案 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 构造函数。

If you change the derivation of derived1 from base1 to be virtual. It is ok to call base1 from derived2. More details here.

答案 2 :(得分:0)

你们之间有衍生1。您只能在初始化列表中调用直接父母