C++中的多态性在引用时无法正常工作

Jac*_*ood 3 c++ polymorphism pointers reference

我有一个简单的代码,无法正确使用引用(多态).

#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;
}
Run Code Online (Sandbox Code Playgroud)

并输出:

Base - Derived
Base - Derived
Run Code Online (Sandbox Code Playgroud)

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

非常感谢!

Who*_*aig 7

您正在调用默认的复制构造函数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;
};
Run Code Online (Sandbox Code Playgroud)

这样你的输出就会变成:

Base - Derived
Base - Derived - Derived
Run Code Online (Sandbox Code Playgroud)

请注意,这不是一个伟大的想法或多态性的恒星学习例子.(但它是建筑覆盖的一个有趣的例子).另请注意,这不是默认复制构造的典型覆盖(其中参数是const-ref-type).因此,这不是最好的样本的部分原因.