首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从多重继承继承

从多重继承继承
EN

Stack Overflow用户
提问于 2014-12-04 22:14:06
回答 1查看 109关注 0票数 0

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

代码语言:javascript
复制
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)
};

效果很好。这方面的问题:

代码语言:javascript
复制
class S : public B // S has fA(),fB()
{
public:
    S() : B(6) {}
};

编译器向我显示:“错误:对`A::a()‘的调用没有匹配函数”

这段代码正在运行,但我并不满意:

代码语言:javascript
复制
class S : public B // S has fA(),fB()
{
public:
    S() : B(6),A(1,6) {}
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-04 22:23:24

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

代码语言:javascript
复制
class S : public B // S has fA(),fB()
{
public:
    S() :   B(6) {}
};  //    ^  A base class is initialized at this point, before B

这也意味着在继承链的另一端忽略了对A的构造函数的其他显式调用:

代码语言:javascript
复制
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编写默认构造函数。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27305159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档