Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么getter和setter是从不同的;基地;?_C++_Multiple Inheritance - Fatal编程技术网

C++ 为什么getter和setter是从不同的;基地;?

C++ 为什么getter和setter是从不同的;基地;?,c++,multiple-inheritance,C++,Multiple Inheritance,程序的输出是a2a3。 我理解,类E有两个“基实例”,因为从B继承不是虚拟的。 有人能解释为什么在E类中从B类的一个“基实例”调用set_c,然后从另一个“基实例”调用get_c-吗 代码如下所示: #包括 甲级 { 公众: A(int n=2):m_n(n){} 公众: int get_n()常量{return m_n;} 空集n(int n){m\u n=n;} 私人: 国际货币基金组织; }; B类 { 公众: B(charc='a'):m_c(c){} 公众: char get_c()常

程序的输出是a2a3。 我理解,类E有两个“基实例”,因为从B继承不是虚拟的。 有人能解释为什么在E类中从B类的一个“基实例”调用set_c,然后从另一个“基实例”调用get_c-吗

代码如下所示:

#包括
甲级
{
公众:
A(int n=2):m_n(n){}
公众:
int get_n()常量{return m_n;}
空集n(int n){m\u n=n;}
私人:
国际货币基金组织;
};
B类
{
公众:
B(charc='a'):m_c(c){}
公众:
char get_c()常量{return m_c;}
空集_c(char c){m_c=c;}
私人:
charm_c;
};
C类
:虚拟公共A
,公共图书馆
{ };
D类
:虚拟公共A
,公共图书馆
{ };
E类
:公共C
,公共图书馆
{ };
int main()
{
E;
C&C=e;
D&D=e;

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

d
c
分别绑定到
e
d
c
子对象

e
D
子对象中开始查找setter
set\u c
。这意味着它将查找
B
的实例,并将setter与驻留在
D
对象中的实例相关联。查找在此停止

对于getter
get_c
,您在
c
子对象中开始查找,因此与getter关联的
B
是驻留在
c
子对象中的一个。现在查找停止在这里


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

请阅读
E::C::B::m_C
!=
E::D::B::m_C
,使用
C
使用第一个,而使用
D
使用第二个。@Jarod42我认为OP已经意识到这两个成员之间的区别s、 正是这导致了这样的困惑:为什么getter返回其中一个mamber,而setter设置另一个mamber。
#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;
}