运行此示例,输出始终为 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++ 多态性不起作用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

神经网络输出始终为 1

未初始化的 int 值始终相同 (C++)

C/C++编程笔记:C++多态性知识详解

华为机试真题 C++ 实现求解连续数列

多态性和pybind11

[c++]第六章概念题 | 多态