一些C++虚函数重载的小问题

来源:互联网 发布:淘宝和京东哪个好 编辑:程序博客网 时间:2024/06/08 07:47

今天又看了一下C++面向对象部分,发现有一些之前没注意到关于虚函数的问题。


先定义基类和派生类

#include <iostream>using namespace std;class A{public:virtual void call(){cout<<"in A"<<endl;}};class B:public A{public:void call(){cout<<"in B"<<endl;}};int main(){A *test=new B();test->call();delete test;system("pause");return 0;}

动态绑定下调用虚函数,基类的函数被覆盖。结果是“in B”


当我们为派生类的同名函数加一个缺省值时

#include <iostream>using namespace std;class A{public:virtual void call(){cout<<"in A"<<endl;}};class B:public A{public:void call(const int a=1){cout<<"in B"<<endl;}};int main(){A *test=new B();test->call();delete test;system("pause");return 0;}

打印出来的结果还是"in A",看上去貌似B的call并没有覆盖基类所定义的虚函数

其实,在B类中,有两个名为call的函数,一是从基类中继承的call的虚函数,类又定义了自己的名为call的函数,接受一个int形参。但是实际上B中的call已经屏蔽了基类的同名函数,但是在B中并没有重定义无参数的虚函数版本,所以通过函数调用仍然调用A中的版本。


再看一个例子

#include <iostream>using namespace std;class A{public:virtual void call(const int a=1){cout<<a<<endl;}};class B:public A{public:void call(const int a=2){cout<<a<<endl;}};int main(){A *test=new B();test->call();delete test;system("pause");return 0;}
这次在两个函数中,形参都一样但是默认缺省值却不一样,结果输出是 1

在虚函数中,默认参数的值是静态绑定的

其实程序调用的并不是A版本的call函数而是B版本的call函数,但是函数上所绑定的默认值是静态绑定,默认参数的缺省值与左边定义指针类型的静态类型有关


0 0