Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 虚函数调用中的错误理解_C++ - Fatal编程技术网

C++ 虚函数调用中的错误理解

C++ 虚函数调用中的错误理解,c++,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

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



}
#包括
使用名称空间std;
甲级{
公众:
虚空f(int n){
f(n);

我可以像下面那样稍微修改一下你的代码。我得到了想要的结果。 i、 e:当从基类指针访问派生类引用时,我让编译器将我的函数调用正确映射到派生类的实现

我想以下事实适用:

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

    #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);
    }
    
    #包括
    使用名称空间std;
    甲级{
    公众:
    
    虚空f(int n){cout这是完全不同的函数。函数由其名称和参数标识。这里没有重写:有两个不同的函数


    <>如果你使用了< C++ > />代码>关键字,

    ,我似乎还记得C++中使用的但是为什么它调用A::f(int n)函数而不是B::f(float n)?我不知道你在这里说什么。@LightnessRacesinOrbit:答案的哪一部分?@lightness:好的,为了重载工作,我们需要一个在相同范围内的函数。现在我们还希望以多态方式调用重载函数。要获得这个结果,我们首先需要重写在基类中声明的原始函数f()(这将在b中创建f()的实例,并添加一个vtable条目,以便可以进行多态调用)。完成后,您将能够以多态方式调用任何重载的f()实例。