毫不从新定义继承来的非虚函数

class B
{
    public:
        void mf();
        ...
};

class D: public B {...};

对于以下行为:ide

D x;

B *pB = &x;
pB->mf();

//和以下的代码
D *pD = &x;
pD->mf();

如上调用的两个mf()理应是相同的,可是若是mf()是个虚函数并且D有本身的mf版本,那就有问题了:函数

class D: public B 
{
    public:
        void mf();//hides B:mf();
        ...
};

pB->mf();    //B::mf()
pD->mf();    //D::mf()

上面两种状况出现的缘由是,非虚函数B::mf和D::mf都是静态绑定(statically bound)的,也就是说,因为pB被声明为pointer-to-B,经过pB调用的非虚函数永远是B所定义的版本,即便pB指向一个类型为派生类的对象。spa

虚函数是动态绑定(dynamically bound)的,若是mf是个虚函数,不论经过pB或是pD调用mf,都会调用D::mf,由于pB和pD真正指的都是一个类型为D的对象。code

解决:若是D真的想要出现与B不同的mf,那就把mf声明为virtual吧。对象

牢记:public继承意味着父类子类是一种is-a的关系。blog

相关文章
相关标签/搜索