gpt4 book ai didi

c++ - 从基类实例调用派生类函数

转载 作者:搜寻专家 更新时间:2023-10-31 02:22:08 24 4
gpt4 key购买 nike

我是 C++ 编程的新用户。当我不通过 new 创建派生实例时,它会调用 Base::test()。那么 Base b = d 和 Base* b1 = new Derived() 有什么区别呢?

基类

#include <iostream>

class Base
{
public:
virtual void test() { std::cout << "Base::test()" << std::endl; };
};

派生类

#include "Base.h"

class Derived : public Base
{
public:
void test() { std::cout << "Derived::test()" << std::endl; };
}

主.cc

#include "Derived.h"

int main()
{
Derived d;
d.test();
Base b;
b = d;
b.test(); // why called Base::test() ?

Base* b1 = new Derived();
b1->test();
delete b1;

return 0;
}

最佳答案

  Derived d;
d.test();
Base b;
b = d;
b.test(); // why called Base::test() ?

您创建了一个Derived 对象dBase 对象b。之后赋值 b=d; 对象切片就在这里发生了。赋值后 b 手头只有 Base 部分 Derived 类信息。因此,当您调用 b.test() 时,它将调用 Base::test() 而不是 Derived::test() 函数。

  Base* b1 = new Derived();
b1->test();
delete b1;

在这里,您在堆中动态创建了一个 Derived 类对象,并将该对象的指针返回给 Base 类指针。这里的指针只是保存 Derived 类对象的内存地址。当您调用 b->test() 时,系统会在内部动态识别对象的类型,并将其作为 Derived 返回。因此它将调用 Derived::test() 函数。

关于c++ - 从基类实例调用派生类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30643508/

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