首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于继承来的虚函数解决办法

2012-04-07 
关于继承来的虚函数书上说:“如果函数有默认形参值,不要重新定义不同的值。原因是:虽然虚函数是动态绑定的,

关于继承来的虚函数
书上说:“如果函数有默认形参值,不要重新定义不同的值。原因是:虽然虚函数是动态绑定的,但默认形参值是静态绑定的。”
可是我这样的程序还是可以执行啊,为什么?
源程序如下:
#include <iostream>
using   namespace   std;
class   B0
{
public:
virtual   void   display(int   a=0){cout < < "B0::display() " < <endl;}
private:
int   b;
};
class   B1:public   B0
{
public:
void   display(float   c=1){cout < < "B1::display() " < <endl;B}

};
class   D1:public   B1
{
public:
void   display(){cout < < "D1::display() " < <endl;}
};
void   fun(B0   *ptr)
{
ptr-> display();
}
int   main()
{
B0   b0,*p;
B1   b1;
D1   d1;
p=&b0;
fun(p);
p=&b1;
fun(p);
p=&d1;
fun(p);
}


[解决办法]
当然是能执行的程序.

如果函数有默认形参值,不要重新定义不同的值。原因是:虽然虚函数是动态绑定的,但默认形参值是静态绑定的

这句话的意思是,在基类里有默认值的时候,不要在子类重新写这个默认值,

class A
{
public:
virtual void f1(int x=0){cout < <x < <endl;}; //这里写0
};
class B: public A
{
public:
void f1(int x=4){cout < <x < <endl;} //这里写4
};

void main()
{
A* p=new B;
p-> f1(); //这时调用f1这个虚函数时,虽然调用的是B类的f1,但默认的x却是A的x,也就
} //是说,要输出x=0, 而不是x=4;

热点排行