首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用虚拟继承解决菱形继承问题,允许跨越

使用虚拟继承解决菱形继承问题,允许跨越
EN

Stack Overflow用户
提问于 2021-01-30 04:10:53
回答 1查看 27关注 0票数 0

考虑以下程序:

代码语言:javascript
运行
复制
#include <iostream>
#include <string>

class B
{
public:
    int n;

    B() : n(0) {}
    B(int m) : n(m) {}
};

class D1 : virtual public B
{
public:
    int a;
    
    D1() : a(0) {}
    D1(int m) : a(m) {}
};

class D2 : public D1
{
public:
    int d;
    
    D2() : d(0) {}
    D2(int m) : d(m) {}
    D2(int j, int k) : d(j), D1(k) {}
    D2(int i, int j, int k) : d(i), D1(j), B(k) {}  //Without virtual inheritance,
                                                    //must add new constructor to D1.
};

int main()
{
    std::string s;
    D2 d2(0, 1, 2);
    
    std::cout << "d2.n = " << d2.n << "\n";
    std::cout << "d2.a = " << d2.a << "\n";
    std::cout << "d2.d = " << d2.d << "\n";
    
    std::cout << "Press ENTER to exit.\n";
    getline(std::cin, s);
}

让D1几乎从B继承允许我从D2的构造函数调用B的构造函数,跳过类D1。

除了钻石继承问题之外,这种虚拟继承的使用是否会导致未定义的行为或其他危害?

除了解决钻石继承问题,我从未见过使用虚拟继承的情况。

EN

回答 1

Stack Overflow用户

发布于 2021-01-30 04:45:31

除了钻石继承问题之外,这种虚拟继承的使用是否会导致未定义的行为或其他危害?

无论出于何种目的,虚拟继承都会招致这些“危害”:

对虚拟基类的

  • 访问是通过指针,这可能会更慢
  • 每个派生类,在所有深度,必须负责从虚拟基类构造虚拟基类必须通过dynamic_cast完成。更快的static_cast是不可能的。

您的示例没有引入任何未定义的行为或危害,这些行为或危害对于任何其他虚拟继承用法都是不存在的。

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

https://stackoverflow.com/questions/65961074

复制
相关文章

相似问题

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