为什么吸气手和二传手来自不同的"bases"?
Why getter and setter are called from different "bases"?
程序的输出是a2a3。 我知道,E类有两个"基本实例",因为从B继承不是虚拟的。 谁能解释为什么从E类B类的一个"基本实例"调用set_c,而get_c类则从另一个"基本实例"调用?
代码来自这里:http://www.interqiew.com/ask?ta=tqcpp04&qn=2
#include <iostream>
class A
{
public:
A(int n = 2) : m_n(n) {}
public:
int get_n() const { return m_n; }
void set_n(int n) { m_n = n; }
private:
int m_n;
};
class B
{
public:
B(char c = 'a') : m_c(c) {}
public:
char get_c() const { return m_c; }
void set_c(char c) { m_c = c; }
private:
char m_c;
};
class C
: virtual public A
, public B
{ };
class D
: virtual public A
, public B
{ };
class E
: public C
, public D
{ };
int main()
{
E e;
C &c = e;
D &d = e;
std::cout << c.get_c() << d.get_n();
c.set_n(3);
d.set_c('b');
std::cout << c.get_c() << d.get_n() << std::endl;
return 0;
}
C++名称查找会考虑正在查找的类的子对象,并将子对象与它找到的名称相关联。这种关联是知道成员函数应该对哪个对象进行操作。找到名称并与一个对象关联(查找是明确的(后,查找将停止。这些规则比我介绍的摘要要复杂得多,但我们已经可以推理您的代码了。您的结果差异源于使用d.set_c('b')
和c.get_c()
。
d
和c
分别绑定到e
的D
和C
子对象。
在e
的D
子对象中开始查找资源库set_c
。这意味着它将查找并关联 setter 的B
实例是驻留在D
对象中的实例。查找到此为止。
对于 getterget_c
,您可以在C
子对象中启动查找,因此与 getter 关联的B
是驻留在C
子对象中的。现在查找到此为止。
正如您已经指出的,这些是不同的子对象,因此 getter 和 setter 不会对相同的数据进行操作。
相关文章:
- 关于仅正确使用二传手和变量的问题
- C++一个函数中的二传手/吸气手?
- 其他类中的枚举类的二传手和获取器
- 编写高性能C++二传手
- 插入运算符的过载与使用二传手功能相比
- 为什么吸气手和二传手来自不同的"bases"?
- 让二传手返回布尔值是好习惯吗?
- 什么时候使用互斥锁的吸气剂和二传手是线程安全的?
- “noexcept”说明符用于获取者和二传手
- 我的二传手在新类中不起作用(继承)
- 我的二传手可以获取参数,但实际上不能?
- 我的球员类中的接球手和二传手的问题
- C++正确的吸气手和二传手
- 来自其他班级的二传手
- 如何通过定义隐藏字段,仅提供二传手和getter
- 将 Boost 与吸气手和二传手一起使用
- 我的井字游戏的吸气机和二传手功能不起作用
- 是否值得添加一个支持移动的二传手
- 重载类函数运算符兼任二传手和吸气手
- 类中的二传手不会设置变量