有一个Base类,它有一个函数add,它可以输入用户的整数并输出它们的总和。还有另一个名为Derived的类,它公开继承了Base类,它也有一个函数add,但它接受真实的作为输入(基本上是float)并输出它们的总和。
现在我想要的是用户输入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;
}
我试着正常地做,也试着使用虚拟,但它没有帮助。
编辑:
这是整个问题:使用运行时多态性的概念执行两个数字的加法。在这里,你必须创建一个基类和派生类。Derived类应该从Base类派生,并且这两个类都包含一个add()函数。在基类中add()函数用于将两个整数相加,在派生类中add()函数用于将两个真实的相加。最后,真实的加法将显示为输出。
看来这只是个愚蠢的问题
1条答案
按热度按时间kdfy810k1#
现在我想要的是用户输入2个数字,代码使用运行时多态性根据输入的类型自动知道调用哪个函数。
这不是多态的工作方式。虚拟派遣简而言之:
ptr
是指向Base
的指针。Base::add
是虚拟的,因此对象的动态类型决定调用哪个方法。该对象的类型为Derived
,因此调用Derived::add
。这就是决定调用什么方法的方式。一旦被调用,它不会根据某些用户输入自动被不同的方法替换。
此外,如果使用
std::cin
读取整数,那么结果将始终存储在该整数中:输入
2.0
和3.0
不会自动将a
和b
转换为float
s。同样如果输入
1
和2
,则存储在a
和b
中的值是浮点数。变量的类型不会根据用户输入自动更改。