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

1bqhqjot  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(130)

有一个Base类,它有一个函数add,它可以输入用户的整数并输出它们的总和。还有另一个名为Derived的类,它公开继承了Base类,它也有一个函数add,但它接受真实的作为输入(基本上是float)并输出它们的总和。
现在我想要的是用户输入2个数字,代码使用运行时多态性根据输入的类型自动知道调用哪个函数。
例如,如果我给予输入2和3,它应该打印5,然后“在基类”,如果我给输入3.5和2.5,它应该打印6.0和“在派生类”。
我在代码中遇到的问题是,即使我给出的输入是2和3,它也在调用派生类的函数,因为它隐式地将整数输入转换为浮点。
下面是我的代码:

  1. #include <iostream>
  2. using namespace std;
  3. class Base {
  4. public:
  5. virtual void add() {
  6. int a, b, c;
  7. cin >> a >> b;
  8. c = a + b;
  9. cout << c << endl;
  10. cout << "base" << endl;
  11. }
  12. };
  13. class Derived : public Base {
  14. public:
  15. void add() {
  16. float a, b, c;
  17. cin >> a >> b;
  18. c = a + b;
  19. cout << c << endl;
  20. cout << "derived" << endl;
  21. }
  22. };
  23. int main() {
  24. Base* ptr;
  25. Derived d;
  26. ptr = &d;
  27. ptr->add();
  28. return 0;
  29. }

我试着正常地做,也试着使用虚拟,但它没有帮助。
编辑:
这是整个问题:使用运行时多态性的概念执行两个数字的加法。在这里,你必须创建一个基类和派生类。Derived类应该从Base类派生,并且这两个类都包含一个add()函数。在基类中add()函数用于将两个整数相加,在派生类中add()函数用于将两个真实的相加。最后,真实的加法将显示为输出。
看来这只是个愚蠢的问题

kdfy810k

kdfy810k1#

现在我想要的是用户输入2个数字,代码使用运行时多态性根据输入的类型自动知道调用哪个函数。
这不是多态的工作方式。虚拟派遣简而言之:

  1. ptr->add();

ptr是指向Base的指针。Base::add是虚拟的,因此对象的动态类型决定调用哪个方法。该对象的类型为Derived,因此调用Derived::add
这就是决定调用什么方法的方式。一旦被调用,它不会根据某些用户输入自动被不同的方法替换。
此外,如果使用std::cin读取整数,那么结果将始终存储在该整数中:

  1. int a, b, c;
  2. cin >> a >> b;

输入2.03.0不会自动将ab转换为float s。同样

  1. float a,b,c;
  2. cin >> a >> b;

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

展开查看全部

相关问题