函数重载和虚函数继承
#include <stdio.h>
class CBase
{
public:
virtual void f(int x) //虚函数
{
printf("CBase:f 函数打印:整数 %d\n", x);
}
void g(float x)
{
printf("CBase: g 函数打印:浮点小数%f\n", x);
}
};
class CBerived :public CBase
{
public:
void f(int x) //重载
{
printf("CBerived : f 函数打印:整数 %d\n", x);
}
void g(float x)
{
printf("CBerived : g 函数打印:浮点小数 %f\n", x);
}
};
void main()
{
CBerived DerivedIbj;//调用派生类函数
DerivedIbj.f(3);
DerivedIbj.g(6.0f);
CBase *pBaseObj = &DerivedIbj;//转换为基类对象进行调用
pBaseObj->f(3);
pBaseObj->g(6.0f);//调用基类g函数
}
输出结果
CBerived : f 函数打印:整数 3
CBerived : g 函数打印:浮点小数 6.000000
CBerived : f 函数打印:整数 3
CBase: g 函数打印:浮点小数6.000000
派生类重载基类的函数f和g,因此派生类调用f和g,实际就是调用派生类的函数f和g。
因为在基类CBase的函数f为virtual函数,而派生类CDerived又重载了该函数;所以f函数被覆盖掉,即CBase函数实际是CDerived::f和CBase::g。
虚函数:
一个函数一经声明为virtual函数,它在派生类众的重载函数也是virtual函数,不必再用virtual修饰;
虚函数的声明之后加上“=0”,函数即为纯虚函数。一个类包含纯虚函数,该类函数成为抽象类。
virtual 函数返回值类型 函数名(参数列表) = 0;
抽象类不能创建对象,作为派生类的接口规范,要求派生类必须提供一个纯虚函数的具体实现,否则产生编译错误。