0

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

我有两节课:

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

4

3 回答 3

3

即使成员是公开的,也不会有冲突。_value但是,如果您尝试从AB的范围访问(假设AB继承自Aand 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.
  }
};
于 2012-07-10T23:43:42.470 回答
1

不会有任何冲突,并且每个子对象数据成员彼此不同。我相信 AB 是一个继承 A、B 的类。

于 2012-07-10T23:39:37.190 回答
1

首先,不要忘记实际继承自Aand 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;

您现在会发现 after ab.a() = 1; ab.b() = 2;,尽管B::value_被修改了,但A::value_没有改变并std::cout << ab.a();打印 1。

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

于 2012-07-10T23:42:04.903 回答