[英]C++ multiple inheritance private member conflict
我的實際問題稍微復雜一點,需要使用模板類。 這是一個簡單的版本。
我有兩節課:
class A
{
public:
float a() { return _value; }
private:
float _value;
};
class B
{
public:
float b() { return _value; }
private:
float _value;
};
class AB : public A, public B
{
public:
// a() should return A::_value ?
// b() should return B::_value ?
}
如果A
和B
的成員_value
是私有成員, _value
之間是否會有沖突? 因為AB
不了解該成員,所以不會發生這種沖突是有道理的。
即使成員是公開的,也不會發生沖突。 但是,如果您嘗試從AB
的范圍訪問_value
(假設AB
繼承自A
和B
)而又不以某種方式限定它,那將是不確定的:
class A { public: float _value; };
class B { public: float _value; };
class AB : public A, public B {
public:
void f() {
std::cout << _value; // Error: ambiguous reference
std::cout << A::_value; // OK
}
};
class AB2 : public A, public B {
public:
using B::_value;
void f() {
std::cout << _value; // OK; resolves to B's version.
}
};
不會有任何沖突,並且每個子對象數據成員都彼此不同。 我相信AB是同時繼承A,B的類。
首先,不要忘記實際繼承自A
和B
也就是說,每個成員函數僅引用其自身類中的變量。 A::a()
和B::b()
都不知道另一個的存在,也不知道它們將由它們衍生而來並且完全不同。
因此,如果您將代碼稍作更改,如下所示:
class A {
float value_;
public:
float& a() { return value_; }
};
class B {
float value_;
public:
float& b() { return value_; }
};
struct AB : A, B {
} ab;
現在,您將在ab.a() = 1; ab.b() = 2;
之后發現它ab.a() = 1; ab.b() = 2;
ab.a() = 1; ab.b() = 2;
,盡管修改了B::value_
,但A::value_
保持不變,且std::cout << ab.a();
打印1。
也就是說,您可能會遇到特定於類模板的問題。 例如,您可能沒有意識到類模板的每個實例都帶有其自己的靜態變量。 (我並不是說情況就是這樣,只是聽起來您的問題與您發布的內容無關。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.