effective c++条款36:绝不重新定义继承而来的non-virtual函数

版权声明:转载请注明出处,谢谢!!! https://blog.csdn.net/qhdhnbd110/article/details/83956448

这个条款算是第六章的一个小总结。

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

1. 父类中三种函数的设计意义:

pure virtual函数(纯虚函数):子类继承其接口并且必须进行重定义,特异性凌驾于不变性;

virtual函数:子类继承其接口和父类中的定义,或者继承其接口并重新定义,不变性与特异性持平;

non-virtual函数:子类继承其接口和定义,不变性凌驾于特异性(is-a模型)。

        根据以上,如果你在子类中重写了一个non-virtual函数,那么理应这个函数在父类中应该是一个virtual函数而不是non-virtual函数,时间长了会给维护代码的人带来疑惑。

2. 如果你在子类中重载了父类中的某个non-virtual函数,那么子类中的函数会将父类中的函数名称覆盖,除非你用作用域调用,否则无法调用父类中的non-virtual函数。

#include <iostream>
using namespace std;
class Base
{
public:
    int Who(int x)
    {
        cout << "Base" << endl;
    }
};
class Derived: public Base
{
public:
    void Who()
    {
        cout << "Derived" << endl;
    }
};
int main()
{
    Derived d;
    d.Who(3); //错误,子类中的Who覆盖了父类中的Who。
    return 0;
}

3. 对于重定义了父类中的一个non-virtual函数的子类,用父类指针和子类指针分别指向一个子类对象,调用同名函数带来的结果是不同的。

#include <iostream>
using namespace std;
class Base
{
public:
    void Who()
    {
        cout << "Base" << endl;
    }
};
class Derived: public Base
{
public:
    void Who()
    {
        cout << "Derived" << endl;
    }
};
int main()
{
    Derived d;
    Base *pB = &d;
    Derived *pD = &d;
    pB->Who(); //调用父类Who
    pD->Who(); //调用子类Who
    return 0;
}

总结一句话:不要重新定义继承而来的non-virtual函数,谢谢大家☺。

猜你喜欢

转载自blog.csdn.net/qhdhnbd110/article/details/83956448