版权声明:转载请注明出处,谢谢!!! 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函数,谢谢大家☺。