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

来源:互联网 发布: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<<"Bname 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;

}

   

输出结果

Bname is B class

Bname is A class

B:A:id=0

    在上面的代码中,类B继承了类A。由于函数foo在类A中是纯虚的,所以对于foo虚函数是动态绑定的。b1.foo()这个调用是调用类B里的foo函数,使用的默认参数是"B class",输出为Bname is B classpa->foo()这个调用将调用类B里的foo函数,使用的默认参数是"A class",输出内容为Bname is A class。其原因就是:虚函数是动态绑定而缺省参数值是静态绑定的。

    因此,我们在重定义继承的函数时不要重定义默认参数,重定义这样的默认参数会让人误解。
原创粉丝点击