虚拟函数调用中的误解

时间:2015-09-12 20:26:52

标签: c++

我有以下代码,我不明白为什么它调用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);



}

2 个答案:

答案 0 :(得分:1)

这些是完全不同的功能。函数由其名称及其参数标识。你没有压倒一切:你有两个不同的功能。

如果您使用override关键字the compiler would have immediately told you this

答案 1 :(得分:0)

我稍微修改了你的代码。我得到了理想的结果。 即:当从基类指针访问派生类引用时,我得到编译器将我的函数调用正确映射到派生类&#39;实施

我想以下事实适用:

  1. 派生类必须首先实现(覆盖:它不会改变签名)基类定义的虚函数能够以多态方式调用/访问它们。
  2. 在基类实现了虚函数之后,它们很可能会被重载。
  3. 另一件事,如果我们看到VTable创建机制,只有当派生类实现在基本calss中定义的虚函数时,才会生成相同函数名的条目。否则,指针A仍然是A类的映射,并且根据类A中函数f的实现,不知道如何解析调用并最终隐式地将5.1 double转换为int。这很漂亮我在第1点提到的内容
  4. 虚拟功能和纯虚函数是一种提供/创建界面的方法,可以在软件的不同层共享,您只需共享界面,就可以隐藏用户的实现。因此,具有由两个类定义的相同函数名/接口只会引起更多混淆。

    #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);
    }
    
  5. 由于本论坛有很多专业人士,如果我的答案中有任何不正确之处,请填写您的意见。 感谢。