C++多继承私有成员冲突
C++ multiple inheritance private member conflict
我的实际问题稍微复杂一些,需要使用模板类。这是一个更简单的版本。
我有两个班:
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 ?
}
如果A
和B
的成员_value
是私有的,那么该成员之间会有任何冲突吗?由于AB
对该成员一无所知,因此不会发生这样的冲突是有道理的。
即使成员是公共的,也不会有冲突。然而,如果您试图从AB
的作用域访问_value
(假设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.
}
};
不会有任何冲突,并且每个子对象数据成员彼此不同。我相信AB是一个同时继承了a和B的类。
首先,不要忘记实际继承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。
也就是说,您可能会遇到类模板特有的问题;例如,您可能没有意识到类模板的每个实例化都有自己的静态变量。(我并不是说是这样,只是听起来你的问题与你发布的内容无关。)
相关文章:
- 使用静态 std::vector 类成员时出现访问冲突
- 类静态成员的冲突声明
- 模板成员函数签名冲突与非模板成员功能签名
- 从结构传递数组成员会导致访问读取冲突
- constexpr静态结构类成员的声明冲突
- 使用 std::map 作为本地成员的内存访问冲突
- 尝试使用成员函数访问动态分配的成员变量时读取访问冲突
- 相互冲突名称的成员变量和方法变量
- 成员名称和构造函数参数名称之间的冲突
- 模板构造函数在 MSVC 中失败,因为成员函数与参数类型的名称冲突
- 受保护成员与重载运算符冲突
- C++多继承私有成员冲突
- MFC:在工作线程中使用对象的成员函数时获取访问冲突错误
- 字符串数据成员的指针错误 - 获取访问冲突
- 复制构造函数与pch中的const成员函数冲突?一个gcc错误
- 从派生类中的强制转换泛型指针访问成员会导致访问冲突
- c++, WIN32, WndProc到成员函数崩溃(访问冲突0x88)
- C++中的命名冲突:如何访问名为 "class" 的结构成员
- 类中成员初始值设定项和初始化列表之间的冲突解决方案
- 从私有成员值类型 (bool) 读取的 VC++ 访问冲突