簡體   English   中英

C ++多繼承私有成員沖突

[英]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 ?
}

如果AB的成員_value是私有成員, _value之間是否會有沖突? 因為AB不了解該成員,所以不會發生這種沖突是有道理的。

即使成員是公開的,也不會發生沖突。 但是,如果您嘗試從AB的范圍訪問_value (假設AB繼承自AB )而又不以某種方式限定它,那將是不確定的:

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的類。

首先,不要忘記實際繼承自AB

也就是說,每個成員函數僅引用其自身類中的變量。 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.

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