这篇文章举了一个简单的例子说明派生类和基类在虚函数和普通函数的问题;
首先声明派生类和基类,并进行定义,如下所示:
声明部分(Header.h):
class FATHER
{
public:
void FUN1();
virtual void virtualFUN2();
};
class CHILD : public FATHER
{
public:
void FUN1();
virtual void virtualFUN2(); //派生类重定义基类虚函数
};
定义部分(Header.cpp):
#include <iostream>
#include "Header1.h"
using namespace std;
void FATHER::FUN1()
{
cout<<"call FATHER FUN1"<<endl;
}
void FATHER::virtualFUN2()
{
cout<<"call FATHER virtualFUN2"<<endl;
}
void CHILD::FUN1()
{
cout<<"call CHILD FUN1"<<endl;
}
void CHILD::virtualFUN2()
{
cout<<"call CHILD virtualFUN2"<<endl;
}
测试部分(test.cpp):
#include <iostream>
#include "Header1.h"
using namespace std;
void main()
{
FATHER father;
CHILD child;
father.FUN1(); //对象是基类,调用基类成员函数
father.virtualFUN2(); //同上
child.FUN1(); //对象是派生类,调用派生类成员函数
child.virtualFUN2(); //同上
cout<<endl;
FATHER *pfather1 = &father;
FATHER *pfather2 = &child;
pfather1->FUN1(); //pfather指向一个基类对象,且FUN1非虚函数,调用基类成员函数
pfather1->virtualFUN2(); //pfather指向一个基类对象,动态绑定基类虚函数
pfather2->FUN1(); //pfather指向一个派生类对象,但是FUN1非虚函数,调用基类成员函数
pfather2->virtualFUN2(); //pfather指向一个派生类对象,动态绑定派生类虚函数
cout<<endl;
FATHER &fa1 = father; //引用的情况和指针情况类似
FATHER &fa2 = child;
fa1.FUN1();
fa1.virtualFUN2();
fa2.FUN1();
fa2.virtualFUN2();
cout<<endl;
system("pause");
}
编译结果如下:
1、在编译时确定非虚函数的调用规则,即无论实际对象是什么类型,都执行基类类型所定义的函数;
2、在运行时确定虚函数的调用规则,即运行的虚函数是指针所指向或引用所绑定的对象所属类型定义的版本。