[英]Virtual inheritance - gcc vs. vc++
我有一個關於虛擬繼承的Visual Studio 2008的問題。
請考慮以下示例:
#include<iostream>
class Print {
public:
Print (const char * name) {
std::cout << name << std::endl;
}
};
class Base : public virtual Print {
public:
Base () : Print("Base") {}
};
class A : public Base {
public:
A () : Print("A") {}
};
class B : public A {
public:
B () : Print("B") {}
};
int main (int argc, char** argv) {
A a; // should print "A"
B b; // should print "B"
return 0;
}
如果我在我的linux機器上使用gcc,這段代碼編譯得很好。 但是,如果我嘗試使用Visual Studio在Windows上構建相同的內容,則編譯將失敗,並顯示錯誤消息“錯誤C2614:'B':非法成員初始化:'Print'不是基礎或成員。”
為什么這不起作用?
從標准[class.base.init]:“除非mem-initializer-id命名構造函數類的非靜態數據成員或該類的直接或虛擬基礎,否則mem-initializer是不正確的。”
顯然,海合會解釋你的情況是合法的,因為Print
是一個非直接的,但虛擬基B
,但是MSVC 2008不看到Print
作為一個虛擬基B
-只有一個非虛基類的虛擬基礎。 (順便提一下,你的例子在VS2005上編譯,所以這是一個令人驚訝的行為變化。)
我傾向於將gcc
解釋為正確(否則措辭'直接基礎'就足夠了)。
要解決此問題,您可以從Print
虛擬地導出B
由於Print
已經是A
的虛擬基礎,因此對類布局或基類Print
子對象的數量沒有任何整體影響。
您使用的是哪個版本的Visual Studio? 您發布的代碼適用於VC 9(特別是15.00.21022.08),VC 6以及其他一些編譯器。
你確定錯誤的class B
類在Visual Studio中看起來不像這樣嗎?
class B { // note: no base class
public:
B () : Print("B") {}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.