总结
普通函数:调用基类还是派生类普通函数,主要是看定义的是基类指针还是派生类指针
虚函数:调用基类还是派生类虚函数,主要看定义的指针实际指向基类还是派生类。
例子
测试程序:
#include<iostream>
using namespace std;
class Base//抽象类
{
public:
void fun()//普通函数,静态绑定
{
cout << "调用基类普通成员函数" << endl;
}
virtual void virFun()//虚函数,动态绑定
{
cout << "调用基类虚函数" << endl;
}
virtual void pureVirFun() = 0;//纯虚函数,接口
};
class A :public Base//基类A
{
public:
void fun()
{
cout << "调用A基类普通成员函数" << endl;
}
virtual void virFun()
{
cout << "调用A基类虚函数" << endl;
}
virtual void pureVirFun() override
{
cout << "调用A基类纯虚函数" << endl;
}
};
class B :public A//派生类B
{
public:
void fun()
{
cout << "调用B派生类普通成员函数" << endl;
}
virtual void virFun()
{
cout << "调用B派生类虚函数" << endl;
}
virtual void pureVirFun() override
{
cout << "调用B派生类纯虚函数" << endl;
}
};
运行变量:
int main()
{
A a;
B b;
A* ptr = &a;//定义指向基类A的指针
cout << "基类A指针地址:" << ptr << endl;
ptr->fun();
ptr->virFun();
ptr->pureVirFun();
cout << endl;
//note:虽然ptr = ptrB但是其指向的内容不一样,
//函数运行结果也不一定一样(多态性)
ptr = &b;//基类指针指向派生类
cout << "基类指针指向派生类B的地址:" << ptr << endl;
ptr->fun();
ptr->virFun();
ptr->pureVirFun();
cout << endl;
B* ptrB = &b;//指向子类的指针
cout << "指向派生类B的指针地址:" << ptrB << endl;
ptrB->fun();
ptrB->virFun();
ptrB->pureVirFun();
cout << endl;
B* ptrBA = (B*)&a;//基类地址,强转指向B
cout << "基类地址,再强转指向B的指针地址:" << ptrBA << endl;
ptrBA->fun();
ptrBA->virFun();
ptrBA->pureVirFun();
cout << endl;
system("pause");
return 0;
}
yunxing
运行结果: