从基类继承两次时如何解决“错误:没有匹配的函数可供调用”

nil*_*ert 5 c++ inheritance initializer-list

我目前正在尝试在我的项目中实现多种继承类。因此,我正在使用成员初始化器列表,并将“变量”一直引用到基类。我真的不确定,为什么会出现编译器错误。

我已经尝试将引用“ 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);
}
Run Code Online (Sandbox Code Playgroud)

尝试编译时出现以下错误消息:

“错误:没有匹配的函数可以调用'Base :: Base()'”

任何想法,我在做什么错?

谢谢你的帮助。

L. *_* F. 2

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

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

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

class Derived2 :public Derived1 {
public:
    Derived2(int &id) : Base(id), Derived1(id)
    {
    };
};
Run Code Online (Sandbox Code Playgroud)

当然,如果Derived1不是虚拟派生Base,那么Derived1派生类可以只依赖Derived1构造函数来初始化Base。因此,根据您的情况,另一个修复方法是简单地删除base-specifiervirtual中的:

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

class Derived2: public Derived1 {
public:
    Derived2(int &id) :Derived1(id)
    {
    };
};
Run Code Online (Sandbox Code Playgroud)