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(); }
以下是我的代码摘要:
基础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。然后使用
构建 TestTest* 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(); }