您的位置:首页 > 编程语言 > C语言/C++

c++:不要重新定义继承而来的non-virtual函数

2015-05-30 16:40 337 查看
资料摘自<Effective C++>

class B{

public:

void mf();

};

void B::mf(){

std::cout<<"B->mf()"<<std::endl;

}

class D:public B{

public:

void mf();

};

void D::mf(){

std::cout<<"D->mf()"<<std::endl;

}

int _tmain(int argc, _TCHAR* argv[])

{

D x;

B * pB = &x;

pB->mf();

D * pD = &x;

pD->mf();

}

输出结果:



由结果看到,两者都通过对象x调用成员函数mf,但结果却不一致.

造成此一两面行为的原因是,non-virtual函数如B::mf和D::mf都是静态绑定.这意思是,由于pB被声明为一个pointer-to-B,通过pB调用的non-virtual函数永远是B所定义的版本,即使pB指向一个类型为"B派生之class"的对象,如本例所示.

另一方面,virtual函数却是动态绑定,所以它们不受这个问题所束.如果mf是个virtual函数,不论是通过pB或pD调用mf,都会导致调用D::mf,因为pB和pD真正指的都是一个类型为D的对象.

重新编写B

class B{

public:

virtual void mf(); //动态绑定

};

输出结果:



现在两者都正确地绑定到指定方法.

注意:任何情况下都不该重新定义一个继承而来的non-virtual函数.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: