虚函数调用中的误解

Missunderstanding in virtual function call

本文关键字:误解 函数调用      更新时间:2023-10-16

我有以下代码,我不明白为什么它调用A类函数而不是B类函数。有人能告诉我为什么吗?

#include<iostream>
using namespace std;
class A{
public:
    virtual void f(int n){
        f(n);
        cout << "A";
    }
};
class B :public A{
public:
    virtual void f(float f){
        cout << "B";
    }
};
int main(){
    A*p= new B;
    p->f(5.1);

}

这是完全不同的功能。函数由其名称及其参数标识。这里没有重写:你有两个不同的函数。

如果您使用了override关键字,编译器会立即告诉您这个

我稍微修改了你的代码如下。我得到了想要的结果。即:当从基类指针访问派生类引用时,我让编译器将我的函数调用正确地映射到派生类的实现。

我猜下列事实适用:

  1. 派生类必须首先实现(重写:这并不是说改变签名)基类定义的虚函数,以便能够多态地调用/访问它们。
  2. 在基类实现了虚函数之后,它们可以很好地被重载。另一件事,如果我们看到VTable创建机制,只有当派生类实现了在基类中定义的虚函数时,才会为相同的函数名创建条目。否则,指针A仍然是类A的映射,不知道如何解析调用,最终根据类A中函数f的实现将5.1双精度型隐式转换为int。这与我在第1点提到的非常相似
  3. 虚函数和纯虚函数是一种提供/创建可以在软件的不同层之间共享的接口的方法,在这种方法中,您只需共享接口,就可以对用户隐藏实现。因此,两个类定义相同的函数名/接口只会造成更多的混淆。

    #include<iostream>
    using namespace std;
    class A{
        public:
          virtual void f(int n){ cout << "A" << endl; }
    };
    class B :public A{
        public:
          void f(int f){ cout << "B" << endl;   }
          void f(float f){ cout << "B" << endl; }
    };
    int main(){
        A*p= new B;
        p->f(5.1);
    }
    

因为这个论坛里有很多专业人士,如果我的回答有什么不正确的,请在你的评论中提出。谢谢。