![](/img/trans.png)
[英]A Diamond issue with Multiple Inheritance: Error in Gcc / Clang but no error in Visual Studio
[英]Clang compilation works while gcc doesn't for diamond inheritance
我不確定我是否在這里遺漏了一些東西,但似乎下面的代碼(類似的代碼可以找到我再也找不到的另一個答案,這里的問題是不同的)編譯就好了鏗鏘而不是為gcc編譯
#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;
}
gcc正在報道
main.cpp: In constructor 'derivedAB::derivedAB(int)':
main.cpp:9:2: error: 'base::base()' is private
base(){};
哪一個是正確的行為? 我會說gcc是一個,但我不確定為什么。
抽象類的虛基類不需要在該抽象基類的構造函數的mem-initializer-list中初始化 。
這將在12.6.2p8中討論:
[...]並且實體不是抽象類的虛擬基類[...]
[ 注意:抽象類(10.4)永遠不是最派生的類,因此它的構造函數永遠不會初始化虛擬基類,因此可以省略相應的mem-initializers。 - 結束說明 ]
所以clang是正確的,gcc是不正確的。 這將是不同的derivedAB
不抽象。
自DR 257以來,這是C ++ 11中的新容差; g ++對於C ++ 03是正確的。 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=19249上有一個gcc錯誤; 也許它可以用戳戳。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.