您的位置:首页 > 其它

决不要重新定义继承而来的缺省参数值

2007-07-16 16:27 267 查看
虚函数是动态绑定而缺省参数值是静态绑定的,因此决不要重新定义继承而来的缺省参数值。

代码
#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。其原因就是:虚函数是动态绑定而缺省参数值是静态绑定的。
因此,我们在重定义继承的函数时不要重定义默认参数,重定义这样的默认参数会让人误解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: