繁体   English   中英

从多重继承继承

[英]Inheritance from multiple 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)
};

这运作良好。 问题与此:

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编写默认构造函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM