我的实际问题有点复杂,需要使用模板类。 这是一个更简单的版本。
我有两个班级:
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
和A
的成员B
之间是否会发生任何冲突?因为AB
不知道该成员,所以不会发生这样的冲突是有道理的。
答案 0 :(得分:3)
即使成员是公开的,也不会有冲突。但是,如果您尝试从_value
的范围访问AB
(假设AB
继承自A
和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.
}
};
答案 1 :(得分:1)
不存在任何冲突,每个子对象数据成员与另一个不同。我相信AB是一个继承A,B的类。
答案 2 :(得分: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_
仍未更改且std::cout << ab.a();
打印1。
那也说,你可能遇到了类模板特有的问题;例如,您可能没有意识到类模板的每个实例都带有自己的静态变量。 (我不是说这种情况,只是听起来你的问题与你发布的内容无关。)