从多重继承

Inheritance from multiple inheritance

本文关键字:多重继承      更新时间:2023-10-16

多重继承有问题。我已经解决了钻石问题:

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)
};

这运作良好。这个问题:

class S : public B // S has fA(),fB()
{
public:
    S() : B(6) {}
};

编译器向我显示:"错误:调用'A::A()'没有匹配函数"

这段代码可以工作,但它不让我满意:

class S : public B // S has fA(),fB()
{
public:
    S() : B(6),A(1,6) {}
};

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

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

这也意味着继承链下游初始化列表中对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
};

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

您自己已经发现了一个解决方案。另一种是为A编写默认构造函数。