C++ 虚函数调用中的错误理解
我有下面的代码,我不明白为什么它调用A类函数而不是B类函数。有人能告诉我为什么吗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
#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()实例。