玩命加载中 . . .

36-绝不重新定义非虚函数


绝不重新定义继承而来的non-virtual函数

非虚函数实行静态绑定,如果派生类重新定义了非虚函数,将会覆盖基类的版本

这样当基类的指针指向派生类对象时,调用的就是基类的版本,因为是静态绑定,所以调用哪个版本取决于指针的静态类型

class B {
public:
    void mf() {
        cout << "B::mf" << endl;
    }
};

class D : public B {
public:
    void mf() {
        cout << "D::mf" << endl;
    }
};

int main() {
    D x;
    B *pb = &x;
    D *pd = &x;
    pb->mf();   // B::mf 静态绑定,调用基类版本
    pd->mf();   // D::mf
    return 0;
}

也表明基类的析构函数必须声明为虚函数,否则用基类指针指向派生类对象,delete基类指针时执行静态绑定,只会调用基类的析构函数,不会调用派生类的析构函数

class B {
public:
    void mf() {
        cout << "B::mf" << endl;
    }
    ~B() {
        cout << "~B" << endl;
    }
};

class D : public B {
public:
    void mf() {
        cout << "D::mf" << endl;
    }
    ~D() {
        cout << "~D" << endl;
    }
};

int main() {
    B *pb = new D;
    pb->mf();   // B::mf
    delete pb;  // ~B
    return 0;
}

文章作者: kunpeng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 kunpeng !
  目录