虚函数调用中的误解
Missunderstanding in virtual function call
我有以下代码,我不明白为什么它调用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
关键字,编译器会立即告诉您这个
我稍微修改了你的代码如下。我得到了想要的结果。即:当从基类指针访问派生类引用时,我让编译器将我的函数调用正确地映射到派生类的实现。
我猜下列事实适用:
- 派生类必须首先实现(重写:这并不是说改变签名)基类定义的虚函数,以便能够多态地调用/访问它们。 在基类实现了虚函数之后,它们可以很好地被重载。另一件事,如果我们看到VTable创建机制,只有当派生类实现了在基类中定义的虚函数时,才会为相同的函数名创建条目。否则,指针A仍然是类A的映射,不知道如何解析调用,最终根据类A中函数f的实现将5.1双精度型隐式转换为int。这与我在第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); }
因为这个论坛里有很多专业人士,如果我的回答有什么不正确的,请在你的评论中提出。谢谢。
相关文章:
- 函数调用中参数的顺序重要吗
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 变量没有改变?通过向量的函数调用
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 模板函数调用
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 析构函数调用
- 成员函数调用和C++对象模型
- 使用共享指针的函数调用,其对象应为 const
- C++:编译时检查匹配的函数调用对?
- 函数调用C++中的参数太少
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 返回指向对象的指针的函数调用是否为 prvalue?
- C++ 如何重载 [] 运算符并进行函数调用
- 代码的效率. 转到和函数调用
- 是同一作用域的函数部分中的函数调用
- 如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
- 虚函数调用中的误解