决不要重新定义继承而来的缺省参数值
来源:互联网 发布:java面向对象的理解 编辑:程序博客网 时间:2024/05/06 04:28
虚函数是动态绑定而缺省参数值是静态绑定的,因此决不要重新定义继承而来的缺省参数值。
代码
#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
在上面的代码中,类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。其原因就是:虚函数是动态绑定而缺省参数值是静态绑定的。
因此,我们在重定义继承的函数时不要重定义默认参数,重定义这样的默认参数会让人误解。- 决不要重新定义继承而来的缺省参数值
- 决不要重新定义继承而来的缺省参数值
- effective c++ 条款38: 决不要重新定义继承而来的缺省参数值
- 决不要重新定义继承而来的缺省参数值
- 决不要重新定义继承而来的缺省参数值
- 条款38: 决不要重新定义继承而来的缺省参数值(有味道的一条)
- 关于C++虚函数默认参数的问题。Effective C++ 条款38: 决不要重新定义继承而来的缺省参数值
- 绝不重新定义继承而来的缺省参数值
- 绝不重新定义继承而来的缺省参数值
- 绝不重新定义继承而来的缺省参数值
- 不重新定义继承而来的缺省参数值
- 不要重新定义继承而来的缺省参数值
- 不要重新定义继承而来的缺省参数值
- 条款37 绝不要重新定义继承而来的缺省参数值
- 绝不要重新定义继承而来的缺省参数值(Effective C++_37)
- 绝对不要重新定义继承而来的缺省参数
- 绝不重新定义继承而来的函数的缺省参数值
- 《Effective C++》37: 绝不重新定义继承而来的缺省的参数值
- ◎Vbs脚本编程简明教程之十二—使用系统对话框
- Installing Oracle 8i Release 3 (8.1.7)
- 得到SDK 运行时库的位置的Code
- 数据库设计方法、规范与技巧(推荐)
- 将access导入SQL server 的方法
- 决不要重新定义继承而来的缺省参数值
- ◎Vbs脚本编程简明教程之十三 —使用dictionary对象
- JSP乱码问题解决方法
- SQL SERVER 与ACCESS、EXCEL的数据转换
- ◎Vbs脚本编程简明教程之十四—VBS内置函数
- 谁操控主盘--谁是专家?!
- 随机数生成
- 深入Struts 1.1
- 真正的初学者常用命令(仅限Lunix)