lee-romantic 's Blog
Everything is OK!
Toggle navigation
lee-romantic 's Blog
主页
About Me
归档
标签
默认实参对虚函数动态绑定的影响
2018-09-20 12:23:48
322
0
0
lee-romantic
##关于利用virtual函数实现动态绑定/多态,需要尤其注意的一点是: *** **必须保证基类和派生类中对应的虚函数除了函数名称一致之外,还必须保证形参和返回值也完全一致!** 若基类和派生类中仅仅是虚函数的函数名称一致,但是形参不一致,则无法实现动态绑定/多态!实际上造成的结果是:派生类中对基类中对应的函数进行了隐藏,在派生类中只能访问派生类中的该函数,在基类中只能访问基类中对应的同名函数。 针对基类和派生类中的虚函数有没有默认实参问题进行讨论。 ###**1.基类虚函数不带参数,派生类带参数** #include<iostream> using namespace std; class super { public: virtual void somemethod()const { cout<<"base" << endl; } }; class sub : public super { public: virtual void somemethod(int i = 12)const { cout<<"sub" << "i = " << i <<endl; } }; int main(void) { sub mysub; super &ref = mysub; ref.somemethod(); // 调用哪个? return 0; } 输出: base 调用的是基类的,派生类是基类这个函数的重新定义的版本,无法实现动态绑定/多态。(这个务必引起重视,因为形参已经不一样了) ###**2.基类虚函数不带参数,派生类带参数** ``` #include<iostream> using namespace std; class super { public: virtual void somemethod(int i = 21)const {cout<<"base"<<"i = "<< i <<endl;} }; class sub : public super { public: virtual void somemethod()const { cout<<"sub" << "i = " << i <<endl; } }; int main(void) { sub mysub; super &ref = mysub; ref.somemethod(); // 调用哪个? return 0; } ``` 输出: Base i = 21 原因和上面的一样。调用的是基类的,派生类是基类这个函数的重新定义的版本,无法实现动态绑定/多态。(这个务必引起重视,因为形参已经不一样了) ###**3.基类虚函数带参数,派生类带参数,且默认实参是一样的。** ``` #include<iostream> using namespace std; class super { public: virtual void somemethod(int i = 12)const {cout<<"base "<<"i = "<< i <<endl;} }; class sub : public super { public: virtual void somemethod(int i = 12)const {cout<<"sub "<<"i = "<< i <<endl;} } int main(void) { sub mysub; super &ref = mysub; ref.somemethod(); // 调用哪个? return 0; } ``` 输出: sub i = 12 ###**4.基类虚函数带参数,派生类带参数,且默认实参不一样的。** ``` #include<iostream> using namespace std; class super { public: virtual void somemethod(int i = 12)const {cout<<"base "<<"i = "<< i <<endl;} }; class sub : public super { public: virtual void somemethod(int i = 21)const { cout<<"sub " << "i = " << i <<endl;} }; int main(void) { sub mysub; super &ref = mysub; ref.somemethod(); // 调用哪个? return 0; } ``` 输出: sub i = 12 原因:你会发现虽然调用的是派生类的函数,但是实参却是基类的。这就是比较变态的地方。
上一篇:
何时需要自定义拷贝构造函数及其他(三法则)
下一篇:
构造函数和析构函数中调用虚函数
0
赞
322 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
提交评论
立即登录
, 发表评论.
没有帐号?
立即注册
0
条评论
More...
文档导航
没有帐号? 立即注册