0

私の実際の問題はもう少し複雑で、テンプレートクラスを使用する必要があります。これはその単純なバージョンです。

私には2つのクラスがあります:

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 ?
}

のメンバーとそのメンバー_valueがプライベートである場合、メンバー間に競合はありますか?そのメンバーの知識がないので、そのような衝突がないことは理にかなっています。ABAB

4

3 に答える 3

3

メンバーが公開されていても、競合は発生しません。ただし、何らかの方法で修飾せずにのスコープ_valueからアクセスしようとすると(とを継承すると仮定して)、あいまいさが生じます。ABABAB

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.
  }
};
于 2012-07-10T23:43:42.470 に答える
1

競合は発生せず、各サブオブジェクトデータメンバーは他のメンバーとは異なります。ABはAとBの両方を継承するクラスだと思います。

于 2012-07-10T23:39:37.190 に答える
1

まず、実際に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;これで、変更された後もB::value_変更されA::value_ずに1が出力されることがわかりますstd::cout << ab.a();

とはいえ、おそらくクラステンプレートに固有の問題が発生しているでしょう。たとえば、クラステンプレートのすべてのインスタンス化に独自の静的変数が付属していることに気付いていない場合があります。(私はこれが事実であると言っているのではなく、あなたの問題があなたが投稿したものとは無関係であるように聞こえるだけです。)

于 2012-07-10T23:42:04.903 に答える