决不要重新定义继承而来的缺省参数值
2007-07-16 16:27
267 查看
虚函数是动态绑定而缺省参数值是静态绑定的,因此决不要重新定义继承而来的缺省参数值。
在上面的代码中,类B继承了类A。由于函数foo在类A中是纯虚的,所以对于foo虚函数是动态绑定的。b1.foo()这个调用是调用类B里的foo函数,使用的默认参数是"B class",输出为B:name is B class。pa->foo()这个调用将调用类B里的foo函数,使用的默认参数是"A class",输出内容为B:name is A class。其原因就是:虚函数是动态绑定而缺省参数值是静态绑定的。
因此,我们在重定义继承的函数时不要重定义默认参数,重定义这样的默认参数会让人误解。
代码 |
#include<iostream> using namespace std; class A{ private: int id; public: A():id(0){} A(int _id):id(_id){}; A(A& obj); virtual void foo(char *name = "A class")const = 0; virtual void print(); virtual ~A(){} }; A::A(A& obj) { this->id = obj.id; } void A::print() { cout<<"A:id="<<this->id<<endl; } class B:public A{ public: B():A(){} B(int _id):A(_id){}; B(B &obj):A(obj){} ~B(){} virtual void foo(char *name = "B class")const; virtual void print(); }; void B::print() { cout<<"B:"; A::print(); } void B::foo(char *name)const { cout<<"B:name is "<<name<<endl; } int main( ) { // A a1(12); // A a2(a1); // a2.print(); B b1; A * pa = &b1; b1.foo(); pa->foo(); pa->print(); return 0; } |
输出结果 |
B:name is B class B:name is A class B:A:id=0 |
因此,我们在重定义继承的函数时不要重定义默认参数,重定义这样的默认参数会让人误解。
相关文章推荐
- 关于C++虚函数默认参数的问题。Effective C++ 条款38: 决不要重新定义继承而来的缺省参数值
- 绝不要重新定义继承而来的缺省参数值(Effective C++_37)
- 不要重新定义继承而来的缺省参数值
- 不要重新定义继承而来的缺省参数值
- C++ 绝不要重新定义继承而来的缺省参数值
- 决不要重新定义继承而来的缺省参数值
- 决不要重新定义继承而来的缺省参数值
- 条款37 绝不要重新定义继承而来的缺省参数值
- effective C++笔记之条款38: 绝不要重新定义继承而来的缺省参数值
- 条款38: 决不要重新定义继承而来的缺省参数值
- 条款38: 决不要重新定义继承而来的缺省参数值(有味道的一条)
- effective c++ 条款38: 决不要重新定义继承而来的缺省参数值
- 条款37:绝不重新定义继承而来的缺省参数值
- 条款37:绝不重新定义继承而来的 缺省参数值
- Effective C++条款 37:绝不重新定义继承而来的缺省参数值
- 绝不重新定义继承而来的缺省参数值!
- [effectiv c++]条款37:绝不重新定义继承而来的缺省参数值(动态绑定,静态绑定,多态性)
- c++:不要重新定义继承而来的non-virtual函数
- Effective C++:绝不重新定义继承而来的缺省参数值
- C++决不要重新定义继承而来的非虚函数