gpt4 book ai didi

c++ - C++ 中的多态性不能正确处理引用

转载 作者:太空狗 更新时间:2023-10-29 19:58:43 25 4
gpt4 key购买 nike

我有一个简单的代码,它不能正确地使用引用(多态性)。

#include <iostream>
#include <string>

class Base {
public:
Base() {}
virtual ~Base() {}
virtual std::string text() const {
return "Base";
}
};

class Derived: public Base {
public:
Derived(Base& _b): b(_b) {}
virtual ~Derived() {}
virtual std::string text() const {
return b.text() + " - Derived";
}

private:
Base& b;
};

int main(int argc, char const *argv[])
{
Base b;
Derived d1(b);
std::cout << d1.text() << std::endl;

Derived d2(d1);
std::cout << d2.text() << std::endl;
return 0;
}

并输出:

Base - Derived
Base - Derived

我预期输出中的第二行:Base - Derived - Derived。我阅读了一些资源,多态性与引用和指针一起完美工作,但在这种情况下,它没有。如果我用指针替换引用,它会再次工作。那么,任何人都可以给我一些解释吗?

非常感谢!

最佳答案

您正在调用 Derived 的默认复制构造函数。因此,完成后 d2 将是 d1 的简单成员拷贝,并且它们的两个 b 成员将引用相同的 Base实例。

为了证明这一点,将其添加到您的 Derived

class Derived: public Base {
public:
Derived(Derived& d) : b(d) {}
Derived(Base& _b): b(_b) {}
virtual ~Derived() {}
virtual std::string text() const {
return b.text() + " - Derived";
}

private:
Base& b;
};

这样你的输出将变成:

Base - Derived
Base - Derived - Derived

请注意,这不是一个宏伟的想法,也不是多态性的主要学习示例。 (但这是构造覆盖的一个有趣示例)。另请注意,这不是默认复制构造的典型覆盖(其中参数是 const-ref-type)。因此,这不是最大样本的部分原因。

关于c++ - C++ 中的多态性不能正确处理引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18415186/

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