如何调用基类的函数来显示运行时多态性?

How do I call the function of the base class to show runtime polymorphism?

提问人:Tanishq Kohli 提问时间:6/21/2023 最后编辑:Tanishq Kohli 更新时间:6/21/2023 访问量:62

问:

有一个类 Base,它有一个函数 add,它输入用户的整数并打印它们的总和。还有另一个名为 Derived 的类,它公开继承了 Base 类,它也有一个函数 add,但它将实数作为输入(基本上是浮点数)并打印它们的总和。

现在,我想要的是让用户输入 2 个数字和代码,以便使用运行时多态性根据输入类型自动知道要调用哪个函数。

例如。如果我给出输入 2 和 3,它应该打印 5,然后“在基类中”,如果我给出输入为 3.5 和 2.5,它应该打印 6.0 和“在派生类中”。

我在代码中面临的问题是,即使我将输入指定为 2 和 3,它也会调用派生类的函数,因为它将整数输入隐式转换为浮点数。

这是我的代码:

#include <iostream>
using namespace std;

class Base {
public:
    virtual void add() {
        int a, b, c;
        cin >> a >> b;
        c = a + b;
        cout << c << endl;
        cout << "base" << endl;
    }
};

class Derived : public Base {
public:
    void add() {
        float a, b, c;
        cin >> a >> b;
        c = a + b;
        cout << c << endl;
        cout << "derived" << endl;
    }
};

int main() {
    Base* ptr;
    Derived d;
    ptr = &d;
    ptr->add();
    return 0;
}

我尝试正常操作,也尝试使用虚拟,但无济于事。

编辑:

这是整个问题: 使用运行时多态性的概念执行两个数字的加法。在这里,您必须创建一个 Base 类和 Derived 类。Derived 类应派生自 Base 类,并且这两个类都将包含一个 add() 函数。在基类中,add() 函数用于添加两个整数,在派生类中,add() 函数用于添加两个实数。最后,实数加法将显示为输出。

看起来这只是一个愚蠢的问题

C++ 虚拟继承运行时 多态性

评论

0赞 463035818_is_not_an_ai 6/21/2023
它是一个派生对象,您可以通过指向基的指针调用派生类的方法。这就是多态性。
0赞 Ted Lyngmo 6/21/2023
“......因为它隐式地将整数输入转换为浮点数“——这不是原因。它之所以调用,是因为这是具有重写函数的最派生类型。只需将函数的内容替换为打印输出即可。addDerivedaddadd
1赞 Nathan Pierson 6/21/2023
你似乎对虚拟函数的工作原理有一个根本性的误解。当用户输入值时,已经决定了你是在还是在 。Base::addDerived::add
0赞 Tanishq Kohli 6/21/2023
@NathanPierson 是的,我知道它会优先考虑派生函数并立即开始使用它。但这就是我被要求做的,展示运行时多态性。我想确认的是,这个特定的例子是不可能的,对吧?
2赞 463035818_is_not_an_ai 6/21/2023
恐怕,我们无法解决这里更深层次的问题,你误解了你的任务。您可以尝试在查询中包含作业的确切文本,但实际上我认为最好向您的导师寻求澄清

答:

1赞 463035818_is_not_an_ai 6/21/2023 #1

现在,我想要的是让用户输入 2 个数字和代码,以便使用运行时多态性根据输入类型自动知道要调用哪个函数。

这不是多态性的工作方式。简而言之,虚拟调度:

 ptr->add();

ptr是指向 的指针。 是虚拟的,因此对象的动态类型决定了调用哪个方法。对象的类型为 ,因此被调用。BaseBase::addDerivedDerived::add

这就是决定调用什么方法的方式。调用后,它不会根据某些用户输入自动替换为其他方法。

此外,如果您用于读取整数,则结果将始终存储在该整数中:std::cin

    int a, b, c;
    cin >> a >> b;

进入,不会自动变成s。同样地2.03.0abfloat

    float a,b,c;
    cin >> a >> b;

如果输入 ,则输入 和 中存储的值是浮点数。变量的类型不会根据用户输入而自动更改。12ab

评论

0赞 Tanishq Kohli 6/21/2023
是的,我明白了。我想确认的是,在这种特定场景中,用户输入数字时,无法确定它将正确调用哪个 add()?因为它发生在运行时,所以它将调用具有更高优先级的添加
0赞 463035818_is_not_an_ai 6/21/2023
@TanishqKohli在答案的前半部分,我试图解释用户输入对调用哪个方法没有任何影响。在您的代码中被调用并且该方法打印,它不能引用其他内容。Derived::add"derived"
1赞 463035818_is_not_an_ai 6/21/2023
@TanishqKohli顺便说一句,这里没有“优先事项”。 只能调用一个方法。正确的。这是因为 do 指向类型的实例并且是虚拟的ptr->add()Derived::addptrDerivedadd
0赞 463035818_is_not_an_ai 6/21/2023
@TanishqKohli可以根据用户输入编写调用不同方法的代码,但这样做的代码将与你的代码大不相同,我也看不出多态性如何适应。正如我上面所评论的,我认为澄清更多的唯一方法是,如果您告诉我们您的任务到底是什么
0赞 Tanishq Kohli 6/21/2023
这是整个问题:使用运行时多态性的概念执行两个数字的加法。在这里,您必须创建一个 Base 类和 Derived 类。Derived 类应派生自 Base 类,并且这两个类都将包含一个 add() 函数。在基类中,add() 函数用于添加两个整数,在派生类中,add() 函数用于添加两个实数。最后,实数加法将显示为输出。