簡體   English   中英

虛擬繼承 - gcc與vc ++

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM