How to fix "error: no matching function for call to" when inheriting twice from a base class

How to fix "error: no matching function for call to" when inheriting twice from a base class

我目前正在尝试在我的项目中实现继承的 classes 的层次结构。因此,我使用成员初始化列表和 "pipe" 对变量的引用,一直到基数 class。我真的不确定,为什么我会收到编译器错误。

我已经尝试将引用 "int &id" 更改为指针 "int* id"。 上面的示例只是指出我的问题的最小示例:

class Base
{
public:
    int& m_id;

    Base(int &id)
        : m_id(id)
    {
    }
};

class Derived1: virtual public Base
{
public:
    Derived1(int &id) : Base(id)
    {
    };
};

class Derived2: public Derived1
{
public:
    Derived2(int &id) : Derived1(id)
    {
    };
};

int main()
{
   int i = 13;
   Derived2 Test(i);
}

我在尝试编译时收到以下错误消息:

"error: no matching function for call to ‘Base::Base()’"

知道吗,我做错了什么?

感谢您的帮助。

虚继承和虚函数是不同的概念。

虚拟继承的特殊之处在于 虚拟基需要由所有派生 类 显式初始化。 在这种情况下,Derived2 尝试将 Base 的初始化委托给 Derived1, 但这是无效的。 Derived2 的构造函数实际上做的是 调用 Base 的默认构造函数 因为省略了初始化 Base.

mem-initializer

您应该显式调用 Base 的构造函数:

class Derived2 :public Derived1 {
public:
    Derived2(int &id) : Base(id), Derived1(id)
    {
    };
};

当然,如果 Derived1 不是从 Base 虚拟派生的, 那么 Derived1 的派生 类 可以只依赖 Derived1 的构造函数 初始化 Base。 所以另一个修复,取决于你的情况, 就是简单地删除 base-specifier:

中的 virtual
class Derived1 :public Base {
public:
    Derived1(int &id) :Base(id)
    {
    };
};

class Derived2: public Derived1 {
public:
    Derived2(int &id) :Derived1(id)
    {
    };
};

虚拟继承是一头奇怪的野兽。它要求 most-derived class 初始化虚拟基 classes。在您的情况下,缺少该初始化。应该这样做:

class Derived2: public Derived1
{
public:
    Derived2(int &id) : Base(id), Derived1(id)
    {
    }
};