读书人

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

发布时间: 2012-04-07 17:31:51 作者: rapoo

关于继承来的虚函数
书上说:“如果函数有默认形参值,不要重新定义不同的值。原因是:虽然虚函数是动态绑定的,但默认形参值是静态绑定的。”
可是我这样的程序还是可以执行啊,为什么?
源程序如下:
#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;

读书人网 >C++

热点推荐