gpt4 book ai didi

c++ - gcc 4.5.1 虚拟继承问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:44:22 25 4
gpt4 key购买 nike

让我们从代码片段开始:

#include <iostream>

struct God{
God(){_test = 8;}
virtual ~God(){}
int _test;
};

struct Base1 : public virtual God{
//Base1(){std::cout << "Base1::Base1" << std::endl;} //enable this line to fix problem
virtual ~Base1(){}
};

struct Base2 : public virtual Base1{
virtual ~Base2(){}
};

struct A1 : public virtual Base2{
A1(){std::cout << "A1:A1()" << std::endl;}
virtual ~A1(){};
};

struct A2 : public virtual Base2{
A2(){std::cout << "A2:A2()" << std::endl;}
virtual ~A2(){};
};


struct Derived: public virtual A1, public virtual A2{
Derived():Base1(){std::cout << "Derived::Derived()" << std::endl;}
Derived(int i){std::cout << "Derived(i)::Derived(i)" << std::endl;}
virtual ~Derived(){}
};


int main(){

God* b1 = new Derived();
std::cout << b1->_test << std::endl; //why it prints 0?

God* b2 = new Derived(5);
std::cout << b2->_test << std::endl;

return 0;
}

使用 GCC 4.5.1 和 4.6.1 编译Derived 类的构造函数之间的唯一区别是第一个明确说明应该调用哪个 Base1 构造函数。我希望 main() 中的两个 cout 都打印 8。不幸的是第一个打印 0!。

为什么?

如果我启用 Base1 构造函数的显式定义,它可以解决问题。如果我在派生类定义(派生类:public A1,public A2)中删除虚拟继承,它也能正常工作。这是预期的行为吗?

在 GCC 3.4.4 或 Microsoft 编译器 (VS) 下无法观察到该问题

最佳答案

这一定是一个编译器错误。我还测试了 GCC 4.2.1,两种情况的结果都是 8。

关于c++ - gcc 4.5.1 虚拟继承问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9203018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com