C++ 当gcc没有';钻石遗产税
我不确定我是否遗漏了一些东西,但似乎下面的代码(类似的代码可以在我再也找不到的另一个答案中找到,这里的问题是不同的)正在编译和更新C++ 当gcc没有';钻石遗产税,c++,inheritance,gcc,c++11,clang,C++,Inheritance,Gcc,C++11,Clang,我不确定我是否遗漏了一些东西,但似乎下面的代码(类似的代码可以在我再也找不到的另一个答案中找到,这里的问题是不同的)正在编译和更新 哪一个是正确的行为?我想说gcc是一个,但我不确定为什么。抽象类的虚拟基类不需要在该抽象基类的构造函数的mem初始值设定项列表中初始化 12.6.2p8中对此进行了讨论: […]并且实体不是抽象类的虚拟基类[…] [注:抽象类(10.4)永远不是最派生的类,因此其构造函数永远不会初始化虚拟基类,因此可以省略相应的mem初始值设定项。-结束注] 所以,叮当声是正确的,
哪一个是正确的行为?我想说gcc是一个,但我不确定为什么。抽象类的虚拟基类不需要在该抽象基类的构造函数的mem初始值设定项列表中初始化 12.6.2p8中对此进行了讨论: […]并且实体不是抽象类的虚拟基类[…]
[注:抽象类(10.4)永远不是最派生的类,因此其构造函数永远不会初始化虚拟基类,因此可以省略相应的mem初始值设定项。-结束注] 所以,叮当声是正确的,而gcc是错误的。如果
derivedAB
不是抽象的,这将是不同的
这是C++11中的一个新容差,因为;对于C++03来说,g++是正确的。有一个gcc错误在;也许这与戳有关。What
返回0代码>main
不需要返回语句。进一步讨论:也相关:如果有人想知道VS2013报告的错误与GCC报告的错误相同,那么如果以后derivedA/derivedB发生更改,并且有人向derivedA和derivedB类添加了一个具有副作用的构造函数,该怎么办?不太容易维护。这需要修复derivedAB可能会破坏使用lastDerived或derivedAB的所有代码(没有编译器错误!),谢谢!现在它有意义了。
#include <iostream>
using namespace std;
class base {
public:
base(int i) {};
private:
base(){};
};
class derivedA: virtual public base {
public:
derivedA(int i) : base(i) {};
protected:
derivedA() : base(0) {};
};
class derivedB: virtual public base {
public:
derivedB(int i) : base(i) {};
protected:
derivedB() : base(0) {};
};
class derivedAB : public derivedA, public derivedB {
public:
derivedAB(int i) {};
virtual ~derivedAB() = 0;
};
derivedAB::~derivedAB() {};
class lastDerived : public derivedAB {
public:
lastDerived() : base(1), derivedAB(0) {};
};
int main(){
lastDerived obj;
}
main.cpp: In constructor 'derivedAB::derivedAB(int)':
main.cpp:9:2: error: 'base::base()' is private
base(){};