加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 构造虚拟基类时的编译器行为

发布时间:2020-12-16 07:17:55 所属栏目:百科 来源:网络整理
导读:考虑一下这段代码: #include iostreamclass A { public: A(int s) { std::cout "A(" s ")n"; }};class B1 : virtual public A { public: B1(int s1,int s2) : A{s1} { std::cout "B1(" s1 "," s2 ")n"; }};class B2 : virtual public A { public: B2(int
考虑一下这段代码:

#include <iostream>

class A {
  public:
    A(int s) { std::cout << "A(" << s << ")n"; }
};

class B1 : virtual public A {
  public:
    B1(int s1,int s2)
        : A{s1} { std::cout << "B1(" << s1 << "," << s2 << ")n"; }
};

class B2 : virtual public A {
  public:
    B2(int s1,int s2)
        : A{s1} { std::cout << "B2(" << s1 << "," << s2 << ")n"; }
};

class C1 : public B1,public B2 {
  public:
    C1() : B1{1,2},B2{3,4},A{5} {}
};

class C2 : public B1,public B2 {
  public:
    C2() : B1(1,2),B2(3,4),A{5} {}
};

int main()
{
    std::cout << "Create c1:n";
    C1 c1;

    std::cout << "n";
    std::cout << "Create c2:n";
    C2 c2;

}

A类是B1和B2的虚拟基类.类C1和C2是相同的,除了C1使用{…}并且C2使用(…)来构造B1和B2.

由于此处使用的虚拟继承,因此应将A类构造为C1或C2构造的一部分.

如果我使用Microsoft VS2015编译此代码,它会在运行时生成此输出:

Create c1:
A(5)
B1(1,2)
B2(3,4)

Create c2:
A(5)
B1(1,4)

这正是我所期待的.

但是如果我用GCC(6.1.0)编译它会产生这个输出:

Create c1:
A(5)
A(1)
B1(1,2)
A(3)
B2(3,4)

这里,在构造c1时,A的构造函数被调用三次,但在构造c2时只调用一次.

这是GCC中的一个错误还是我误解了一些东西?

解决方法

回答我自己的问题:

显然,GCC在这种情况下确实存在错误.使用GCC 7.0.0版编译代码会使用此输出生成正确的行为:

Create c1:
A(5)
B1(1,4)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读