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

C++ multiple inheritance private member conflict

本文关键字:成员 冲突 继承 C++      更新时间:2023-10-16

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

我有两个班:

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是私有的,那么该成员之间会有任何冲突吗?由于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;之后,尽管B::value_被修改,但A::value_保持不变,std::cout << ab.a();打印1。

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