为什么 getter 和 setter 是从不同的 "bases" 调用的?
Why getter and setter are called from different "bases"?
一个程序的输出是a2a3。
我明白,class E 有两个 "base instances",因为 B 的继承不是虚拟的。
谁能解释为什么 set_c 是从 class E 中的 "base instance" 中的一个 class B 和 get_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++ 名称查找考虑了正在查找的 class 的子对象,并将该子对象与它找到的名称相关联。这个关联就是知道成员函数应该操作什么对象。一旦找到名称并将其与一个对象相关联(查找是明确的),查找就会停止。规则比我提供的摘要要复杂得多,但我们已经可以对您的代码进行推理。您的结果差异源于使用 d.set_c('b')
和 c.get_c()
.
d
和 c
分别绑定到 e
的 D
和 C
子对象。
您开始在 e
的 D
子对象中查找 setter set_c
。这意味着它将找到 setter 并将其关联的 B
的实例是驻留在 D
对象中的实例。查找到此为止。
对于 getter get_c
,您在 C
子对象中开始查找,因此与 getter 关联的 B
是驻留在 C
子对象中的对象。现在查找到此停止。
正如您已经注意到的,这些是不同的子对象,因此 getter 和 setter 不会对相同的数据进行操作。
一个程序的输出是a2a3。 我明白,class E 有两个 "base instances",因为 B 的继承不是虚拟的。 谁能解释为什么 set_c 是从 class E 中的 "base instance" 中的一个 class B 和 get_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++ 名称查找考虑了正在查找的 class 的子对象,并将该子对象与它找到的名称相关联。这个关联就是知道成员函数应该操作什么对象。一旦找到名称并将其与一个对象相关联(查找是明确的),查找就会停止。规则比我提供的摘要要复杂得多,但我们已经可以对您的代码进行推理。您的结果差异源于使用 d.set_c('b')
和 c.get_c()
.
d
和 c
分别绑定到 e
的 D
和 C
子对象。
您开始在 e
的 D
子对象中查找 setter set_c
。这意味着它将找到 setter 并将其关联的 B
的实例是驻留在 D
对象中的实例。查找到此为止。
对于 getter get_c
,您在 C
子对象中开始查找,因此与 getter 关联的 B
是驻留在 C
子对象中的对象。现在查找到此停止。
正如您已经注意到的,这些是不同的子对象,因此 getter 和 setter 不会对相同的数据进行操作。