运行此示例,输出始终为 1。似乎 C++ 多态性不起作用? [复制]
Posted
技术标签:
【中文标题】运行此示例,输出始终为 1。似乎 C++ 多态性不起作用? [复制]【英文标题】:Running this example the output is always 1. It seems that the C++ polymorphism is not working? [duplicate] 【发布时间】:2020-12-04 15:44:36 【问题描述】:我正在学习 C++,并面临这个测验。为什么输出总是1? 为什么多态性不起作用?计算操作系统类 MyClassTwo 和 MyClassThree 的方法没有被调用。
#include <iostream>
using namespace std;
class MyClassOne
public:
int calculate() return 1;
;
class MyClassTwo : public MyClassOne
public:
virtual int calculate() return 2;
;
class MyClassThree : public MyClassTwo
public:
int calculate() return 3;
;
int main()
int result = 0;
MyClassOne* objs[3];
objs[0] = new MyClassOne();
objs[1] = new MyClassTwo();
objs[2] = new MyClassThree();
for (int i = 0; i < 3; ++i)
cout << objs[i]->calculate() << endl;
return 0;
【问题讨论】:
在基类MyClassOne
中使 calculate
虚拟化。
基类没有calculate
函数virtual....
你应该有 int calculate() override return 2;
而不是 virtual int calculate() return 2;
并创建基本函数 virtual int calculate() return 1;
。在派生类中使用override
将帮助您避免犯此错误以及其他错误,例如具有不同的签名。
@drescherjm 这是一个测验测试,所以不是错字而是故意的。
你是对的。我不是那个投票关闭作为错字的人,而是想到了这一点。我还没有阅读这个问题。在查看问题之前,我通常会查看代码。
【参考方案1】:
MyClassOne::calculate
不是virtual
:
class MyClassOne
public:
int calculate() return 1;
;
因此,如果您在 MyClassOne*
上调用 calculate
,则调用的是该方法,而不是其他方法。
【讨论】:
谢谢。我真的很感激所有的答案。【参考方案2】:数组objs
的元素静态类型为MyClassOne*
MyClassOne* objs[3];
所以在这个表达式中:
objs[i]->calculate()
名称calculate 在MyClassOne
类中搜索。在这个类中有一个声明的非虚函数calculate:
class MyClassOne
public:
int calculate() return 1;
;
每个指向的对象都会调用它。也许你的意思是
class MyClassOne
public:
virtual int calculate() return 1;
;
【讨论】:
以上是关于运行此示例,输出始终为 1。似乎 C++ 多态性不起作用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章