#include
using namespace std;
class A
{
public:
virtual void f(int val=1){
cout<<"A->"< }
virtual void test()
{
f();
}
};
class B:public A
{
public:
virtual void f(int val=0)
{
cout"< }
};
int main()
{
A* pa;
B* pb =new B();
pa=pb;
pa->f();
pb->f();
cout<<"_______________"< pa->test();
pb->test();
}
第一次直接调用f()结果我能明白,但为什么通过B->test()调用的结果会是1而不是0,B的虚函数表不也包含test吗?调用的也是B的f啊?可结果??
结果:
原文转自nwplei的博客
当通过指针调用一个对象的方法时,如果该方法是虚函数,则实际调用的是该实例的方法。当缺省参数和虚函数一起出现的时候到底用哪个默认值呢?虚函数是动态绑定的,但是为了执行效率,缺省参数是静态绑定的。
也就是 指针是哪种类型,就调用该类型对应的类中,该函数定义时的缺省值。#include
using namespace std;
class A
{
pu......
答案就在这里:C++中 虚函数中的默认参数问题
----------------------Hi,地球人,我是问答机器人小S,上面的内容就是我狂拽酷炫叼炸天的答案,除了赞同,你还有别的选择吗?
b没有自己的test,就调用a的,然后接着调用a的f
但是pb调用的test函数是class A的,所以就找到A的f()了。
调用pa->f(),相当于调用 B::f(1),pa的对象为B,虚函数调用实际对象的函数,但缺省参数在编译时决定,因此是1
调用pb->f(),相当于调用 B::f(0),pa的对象为B,绑定参数0
调用pa->test(),相当于调用 A::test()。因为对象B没有实现test(),虚函数指针指向基类的虚函数。此时,test()中调用的f()相当于调用 B::f(1)。因为pa的对象为B,B重写了f(),但是参数编译时绑定A::f()的缺省参数。
调用pb->test(),相当于调用 A::test()。因为对象B没有实现test(),虚函数指针指向基类的虚函数。此时,test()中调用的f()相当于调用 B::f(1)。原因同上。