gpt4 book ai didi

C++ 虚拟类 : interesting point

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:05:12 24 4
gpt4 key购买 nike

请告诉我为什么以下程序的输出如下所示。我没有得到 C++ 中的虚拟类。观察下面的代码:

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: public B
{ };

class D: public B
{ };

class E
: public C
, public D
{ };

int main()
{
E e;
C &c = e;
D &d = e;
std::cout << c.get_c();
d.set_c('b');
std::cout << c.get_c() << std::endl;
return 0;
}

O/P: aa我希望输出是 ab。获得“aa”的原因是什么?

如果我有 c.set_c('b') 而不是 d.set_c('b') 那么我会得到 O/P : "ab",在这里,我也不明白为什么会这样。 c、d 都只指一个对象。

class C:virtual public B{};
class D:virtual public B{};

如果类C、类D都是从B虚拟继承的,那么O/P 永远是 "ab"

最佳答案

E中有两份B,一份通过C,一份通过D。当您调用 d.set_c('b') 时,您正在修改 DB 中的 m_c >。当你调用 c.get_c() 时,你会得到 CB 中的 m_c,它已经'改变了。

当你让 CD 实际上从 B 继承时,它就解决了这个问题,因为这样只有一份 BE 中。

这是相关的:http://www.parashift.com/c++-faq/virtual-inheritance-where.html

关于C++ 虚拟类 : interesting point,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12695763/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com