C ++多重继承私有成员冲突

时间:2012-07-10 23:27:44

标签: c++ multiple-inheritance

我的实际问题有点复杂,需要使用模板类。 这是一个更简单的版本。

我有两个班级:

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

如果该成员是私人成员,_valueA的成员B之间是否会发生任何冲突?因为AB不知道该成员,所以不会发生这样的冲突是有道理的。

3 个答案:

答案 0 :(得分:3)

即使成员是公开的,也不会有冲突。但是,如果您尝试从_value的范围访问AB(假设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.
  }
};

答案 1 :(得分:1)

不存在任何冲突,每个子对象数据成员与另一个不同。我相信AB是一个继承A,B的类。

答案 2 :(得分:1)

首先,不要忘记实际继承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;之后,尽管B::value_被修改,A::value_仍未更改且std::cout << ab.a();打印1。

那也说,你可能遇到了类模板特有的问题;例如,您可能没有意识到类模板的每个实例都带有自己的静态变量。 (我不是说这种情况,只是听起来你的问题与你发布的内容无关。)