C++ 在通过 const 引用传递时不调用派生 class 函数

C++ not calling derived class function when passing by const reference

以下是我的代码摘要:

基础class:

#include <iostream>
using namespace std;
class Base {
public:
    Base() { cout << "Base constructor" << endl; }
    ~Base() { cout << "Base destructor" << endl; }
    virtual void func(void) const { cout << "base" << endl; }
};

派生class:

#include "Base.h"
class Derived : public Base {
public:
    Derived() { cout << "Derived constructor" << endl; }
    ~Derived() { cout << "Derived destructor" << endl; }
    void func(void) const { cout << "derived" << endl; }
};

测试class:

#include "Derived.h"

class Test {
public:
    const Base& base;
    Test(const Base& _base) : base(_base) { cout << "Test constructor" << endl; }
    void test() { base->func(); }
    ~Test() { cout << "Test destructor" << endl; }
};

主要测试功能:

#include "Test.h"
int main(void) {
    Test* t = new Test(Derived());
    t->test();
    return 0;
}

当我运行主函数时,Base版本的func被调用。

但是,如果我将主要功能更改为以下内容:

#include "Test.h"
int main(void) {
    Derived d;
    Test* t = new Test(d);
    t->test();
    return 0;
}

Derived 版本的 func 被正确调用。 我还尝试将 Test 中的 const Base& base 更改为 Base* base。然后使用

构建 Test
Test* t = new Test(new Derivec())

事实证明 Derived 版本的 func 也被正确调用。

我在想,如果我使用引用或指针,多态性就会起作用。

谁能给我解释一下为什么第一个版本没有正确调用派生的class方法?

非常感谢您的帮助!

你有一个悬空引用问题。

Test* t = new Test(Derived());

您正在使用 Derived 类型的临时对象来构造 t。在 Test returns.

的构造函数之后删除了临时对象

因此,您的程序具有未定义的行为。

如果你使用

Derived d;
Test* t = new Test(d);

您得到了预期的行为,因为 t 没有悬空引用。


另请注意

void test() { base->func(); }

不应编译,因为 base 是引用。该行需要是:

void test() { base.func(); }