我在訪問多繼承下的父類成員(同名)時遇到了麻煩。我有4個類(經典的鉆石問題),定義如下:
class ClapTrap
{
public:
ClapTrap(void)
{ _hitpoints = 0; }
~ClapTrap() { }
protected:
int _hitpoints;
};
class ScravTrap : public virtual ClapTrap
{
public:
ScravTrap(void)
{ _hitpoints = 1; }
~ScravTrap() { }; _hitpoints = 1; }.
};
class FragTrap : public virtual ClapTrap
{
public:
FragTrap(void)
{ _hitpoints = 2; }
~FragTrap() { }; _hitpoints = 2; }.
};
class DiamondTrap : public ScravTrap, public FragTrap
{
public:
DiamondTrap(void)
{
std::cout << ScravTrap::_hitpoints << std::endl;
std::cout << FragTrap::_hitpoints << std::endl;
}
~DiamondTrap() { }; }
};
int main()
{
DiamondTrap d;
}
我的main的輸出是
2
2
我預期這個輸出是
1
2
因為第一次我列印的是DiamondTrap的ScravTrap::_hitpoints成員(并且ScrapTrap::_hitpoints被初始化為1),第二次我列印的是DiamondTrap的FragTrap::_hitpoints成員(之前已經被初始化為2)。我知道 DiamondTrap 繼承了這兩個 _hitpoint 成員,但是我怎樣才能正確地訪問它們呢?
注意即使我在DiamondTrap類的公共部分的開頭寫上using ScravTrap::_hitpoints,輸出結果仍然是一樣。為什么會出現這種情況?
編輯有些答案提到,虛擬繼承只生成基類的一個副本。我想在創建 DiamondTrap 的實體時只呼叫 ClapTrap 的建構式一次。我怎樣才能做到這一點,同時也能訪問ScravTrap::_hitpoints和FragTrap::_hitpoints?如果我在每個父類中有兩個成員怎么辦?DiamondTrap能否從FragTrap繼承其中一個,從ScravTrap繼承其中一個?我怎樣才能做到這一點?
uj5u.com熱心網友回復:
只有一個 ClapTrap,因為你使用了virtual 繼承,而且只有一個_hitpoints。
你不能讓這一個_hitpoints變數攜帶多個值。
首先,構建ClapTrap,分配0,然后構建ScravTrap,分配1,最后,構建FragTrap,分配2--所有這些都在同一個_hitpoints變數上。
我想在創建DiamondTrap的實體時只呼叫ClapTrap的建構式一次。
這就是你現在所做的。
這就是你現在所做的。
我怎樣才能做到這一點,并且還能同時訪問
ScravTrap::_hitpoints和FragTrap::_hitpoints?
你不能這樣做。你必須選擇一個或另一個。
如果沒有virtual繼承,你將有兩個建構式呼叫和ScravTrap::_hitpoints和FragTrap::_hitpoints。
使用virtual繼承,你將有一個建構式呼叫和只有一個_hitpoints。
uj5u.com熱心網友回復:
我期望這個輸出是
1 2
一個int物件不能同時有兩個不同的值,所以這個輸出是不可能的。
知道DiamondTrap繼承了兩個_hitpoint成員
只有一個
ClapTrap,因此只有一個_hitpoint成員。為什么會出現這種情況?
發生這種情況是因為你使用了虛擬繼承。
_hitpoints首先在虛擬基ClapTrap的建構式中被初始化為不確定的值,然后將其賦值為0。之后,基ScravTrap的建構式將其賦值為1,最后,基FragTrap的建構式將其賦予2。在創建DiamondTrap的實體時,希望只呼叫ClapTrap的建構式一次。我怎樣才能做到這一點,并同時訪問 ScravTrap::_hitpoints 和 FragTrap::_hitpoints 呢?
從
ClapTrap中移除該成員,并將該成員添加到ScravTrap和FragTrap中,將實作您的愿望。目前還不清楚你為什么要這樣做。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/320081.html
標籤:
上一篇:IOB藍牙通過沙盒訪問被阻止
