/*虚函数*/
/***********************************************************************
虚函数建立在继承情况下的
虚函数:一个成员函数(不包括构造函数和静态成员函数)前面有virtual关键字
虚函数好处: 可以用一致的(相同的)方法,在不同种情况,完成不一样的实现
用同样的接口,完成不同的实现
虚函数写法:
1.在基类和派生类中,有同名的函数,参数一样,返回值一样。那么在基类中
此函数前加上virtual关键字,派生类(virtual)可加可不加
2.调用,必须使用基类的指针或则引用完成调用
如何判断函数去哪里?
pb->Fun();
基类的指针调用函数FUN
1如果FUN是非虚成员函数,那么执行 基类::FUN()
2如果FUN是虚函数
a.如果基类指针指向的是基类对象,执行基类::FUN()
b.如果基类指针指向的是派生类对象,执行派生类::FUN()
***********************************************************************/
#include "stdafx.h"
#include <iostream.h>
class A
{
public:
virtual void Show()
{
cout << "A::Show()" << endl;
}
};
class B : public A
{
public:
virtual void Show()
{
cout << "B::Show()" << endl;
}
};
void FunShow( A* pA )
{
pA->Show();
}
int main(int argc, char* argv[])
{
B theB;
A theA;
A* pA = NULL;
//如果FUN是虚函数
pA = &theA;
//a.如果基类指针指向的是基类对象,执行基类::FUN()
pA->Show();
//如果FUN是虚函数
pA = &theB;
//b.如果基类指针指向的是派生类对象,执行派生类::FUN()
pA->Show();
//虽然没有数据成员,但大小都为4
//因为virtual 其实就是一个函数指针数组的首地址
//一个类中有几个虚函数,数组里边就有几个虚函数地址
cout << "基类对象大小" << sizeof(A) << endl;
cout << "派生对象大小" << sizeof(B) << endl;
//基类的指针调用函数FUN pb->Fun();
//1如果FUN是非虚成员函数,那么执行 基类::FUN()
//2如果FUN是虚函数
//a.如果基类指针指向的是基类对象,执行基类::FUN()
//b.如果基类指针指向的是派生类对象,执行派生类::FUN()
return 0;
}
来源:https://www.cnblogs.com/w413133157/archive/2010/01/26/1657069.html