从多重继承继承

Ser*_*bin 0 c++ inheritance

多重继承有问题.我解决了钻石问题:

class A
{
    int m;
    int n;
public:
    A(int x, int y)
    {
        m = x; n = y
    }
    fA() {}
};

class B : virtual public A // B has fA(),fB()
{
public:
    B(int k) : A(1, k) {}
    fB() {}
};

class C : virtual public A // C has fA(),fC()
{
public:
    C(int k) : C(2, k) {}
    fC() {}
};

class D : public B, public C // D has fA(),fB(),fC()
{
public:
    D(int k) : B(k),C(k),A(3,k)
};
Run Code Online (Sandbox Code Playgroud)

这很好用.这个问题:

class S : public B // S has fA(),fB()
{
public:
    S() : B(6) {}
};
Run Code Online (Sandbox Code Playgroud)

Compilator告诉我:"错误:没有匹配函数来调用`A :: A()'"

这段代码有效,但它不满足我:

class S : public B // S has fA(),fB()
{
public:
    S() : B(6),A(1,6) {}
};
Run Code Online (Sandbox Code Playgroud)

jro*_*rok 6

在虚拟继承中,从大多数派生类的构造函数中调用虚拟基础的构造函数:

class S : public B // S has fA(),fB()
{
public:
    S() :   B(6) {}
};  //    ^  A base class is initialized at this point, before B
Run Code Online (Sandbox Code Playgroud)

这也意味着A忽略继承链中的初始化列表中对构造函数的其他显式调用:

class B : virtual public A // B has fA(),fB()
{
public:
    B(int k) : A(1, k) {}
    fB() {} // ^^^^^^^    this call is ignored when B is a part of S object
};
Run Code Online (Sandbox Code Playgroud)

如果在大多数派生类的初始化列表中没有显式调用虚拟基础的构造函数,编译器将(当然)尝试调用默认构造函数.但A没有一个,这是你的问题.

您已经发现的一种解决方案.另一种是为默认构造函数编写A.