我寫了這段代碼,以便我能更多地了解 c ,我知道我收到這個警告是因為 B 類和 C 類中的虛擬繼承不是虛擬公共繼承,我知道如果我改變它,這個警告就會消失。
但我不明白的是:為什么我的代碼有效,如果我只進行此更改,為什么它不會收到此警告---> class C:virtual public A而沒有對兩個類(C 和 B)進行更改:
#include <iostream>
using namespace std;
class A
{
public:
A() { cout << "A"; }
A(const A&) { cout << "a"; }
};
class B : virtual A
{
public:
B() { cout << "B"; }
B(const B&) { cout << "b"; }
};
class C : virtual A
{
public:
C() { cout << "C"; }
C(const C&) { cout << "c"; }
};
class D :B, C
{
public:
D() { cout << "D"; }
D(const D&) { cout << "d"; }
};
int main()
{
D d1;
D d2(d1);
}
: 警告 C4594: 類 'D' 永遠不能被實體化 - 間接虛擬基類 'A' 不可訪問
:訊息:“A”是“B”的私有基類
uj5u.com熱心網友回復:
實際上protected,代替public就足夠了...
現在假設您的類不會虛擬繼承。
現在發生的情況是,任何 的實體都B包含它自己的實體A以及 的任何實體C。B和Ccall的建構式都A已經有了,繼承類D不需要關心。
如果引入了虛擬繼承,情況就會改變:現在,構造唯一實體的任務A被委托給最派生的類,D在給定的情況下。
D現在需要訪問這個通用實體A才能呼叫它的建構式。這可以通過B 或 (!) via發生C——因此,如果其中至少一個至少protected提供對單個實體的訪問就足夠了——C在給定的情況下,但也可能B如此。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/496782.html
上一篇:BeastSSL連接正常關閉
