- 论坛徽章:
- 1
|
请教纯虚函数(virtual)中的参数缺省值有什么作用?
你这里出错的原因是你没有搞清楚虚函数之动态绑定机制和缺省参数在继承中的意义.
1>;什么是动态类型与静态类型?
比如你这里A *pa = new B;这里的pa的静态类型就是A *而它的动态类型呢就是B,而B *pb=new B;它的动态与静态类型都是B *.但你这里用的是B b;b的型别是B,静态与动态类型都是B,虚函数是用来干什么的?是用来动态绑定的呀,而动态绑定是需要通过指针或引用实现的呀,你直接用类对象能实现动态绑定吗?所以你这里根本不会根据基类A的成员函数来动态绑定来调用B的相应成员函数,所以缺省参数就没有.
2>;缺省参数是个静态绑定的而非动态.即如有:
A *pa = new B;
那么pa->;fun(..);此时pa的静态类型为A *,它有缺省参数值,所以如果你把
void B:: func(int a, int b) 改成void B::func(int a, int b=7) 后它用的默认参数值还是A中定义的.虽然实际上调用的是B的成员函数.但并没有用B的成员函数中参数的默认值.所以注意一点就是不要在继承中改变默认参数值的定义.
居于以上两点你的程序可以改为如下:main部分:
- int main()
- {
- B b;
- A &rb=b;
- rb.func(10);
- }
复制代码 |
|