gpt4 book ai didi

c++ - 多态性不适用于相同数据类型(基类和继承类)的函数返回值

转载 作者:行者123 更新时间:2023-11-30 03:55:13 24 4
gpt4 key购买 nike

据我所知,要在继承类中覆盖虚函数,该函数的返回值数据类型应与基类函数相同。

但是如果你返回的指针或值属于继承自原函数返回值类的类,编译器将接受更改返回值,如下所示:

#include <iostream>

class Base{
public:
virtual Base * clone() {
std::cout << "Base::clone()\n" ;
Base * bp = new Base ;
return bp ;
}
std::string ID() {return "Base class";}
};

class Derived: public Base {
public:
//Derived* and Base* are same data type (acceptable):
Derived * clone() {
std::cout << "Derived::clone()\n" ;
Derived * dp = new Derived ;
return dp ;
}
std::string ID() {return "Derived class";}
};


int main() {

Base * bp = new Derived;

std::cout << bp->clone()->ID() <<"\n";

std::cout << dynamic_cast <Derived*>(bp->clone())->ID() <<"\n";
/*
next code give error: cannot convert Base* to Derived*:

Derived * dp2 = bp->clone();
std::cout << dp2->ID() << "\n";
*/
}

g++ 的输出是:

Derived::clone()
Base class
Derived::clone()
Derived class

重写 Derived 类中的 clone() 函数返回指向堆上同一对象拷贝的指针。从输出中可以看出,每次都会调用正确版本的 clone(),但不会调用 ID()。为了解决这个问题,我不得不通过 dynamic_cast 或在基类中创建 virtual ID() 来向下转换返回值以获得预期的效果。

我的问题:为什么多态在第一种情况下不起作用

  std::cout << bp->clone()->ID() <<"\n";

as clone() 应该从 Derived 类返回一个指向对象的指针,因此返回 Derived 的 ID() 函数 类不是 Base 类,但在这种情况下,我有 Base 类的 ID() 函数?

最佳答案

多态性在这种情况下正常工作。当您期望 Derived class 时代码打印 Base class 的原因是因为 ID() 方法不是 virtual.

为了理解发生了什么,您必须像编译器一样查看代码。在您的示例中, bp 是指向 Derived 实例的指针,但它在代码中被键入为 Base * 因此编译器看到一个 基础*。当编译器稍后在代码中看到 bp->clone() 它知道 Base 类的 clone() 方法返回一个 基础*。最后,当编译器到达 ->ID() 方法调用时,它查看 Base 类定义并看到一个非虚方法,因此它确保在运行时,Base::ID() 方法在该位置被调用。

如果您想要多态行为,请为两个 ID() 方法添加 virtual 关键字。您还可以添加 override Derived::ID() 上的关键字,如果您使用 C++2011 兼容的编译器。

关于c++ - 多态性不适用于相同数据类型(基类和继承类)的函数返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29179035/

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