为什么从不同的“基础”调用getter和setter?

时间:2019-08-19 06:08:06

标签: c++ multiple-inheritance

程序的输出为a2a3。 我知道,类E具有两个“基本实例”,因为从B继承不是虚拟的。 谁能解释为什么从类E中的类B的一个“基本实例”和从另一个中的get_c调用set_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;
}

1 个答案:

答案 0 :(得分:1)

C ++名称查找考虑了要查找的类的子对象,并将该子对象与其找到的名称相关联。这种关联是为了知道成员函数应该在哪个对象上进行操作。一旦找到名称并将其与一个对象相关联(查找是明确的),查找就会停止。这些规则比我提供的摘要要复杂得多,但是我们已经可以对您的代码进行推理了。您在结果上的差异源于使用d.set_c('b')c.get_c()

dc分别绑定到D的{​​{1}}和C子对象。

您可以在e的{​​{1}}子对象中开始查找setter set_c。这意味着D的实例将找到并关联该setter,即该实例位于e对象中。查找到此为止。

对于吸气剂B,您可以在D子对象中开始查找,因此与吸气剂相关联的get_c就是{{1 }}子对象。现在查找在这里停止。

正如您已经提到的,这些是不同的子对象,因此getter和setter不会对同一数据进行操作。