/*
C++中的多态、虚函数、父类子类
1、 如果你期望衍生类别重新定义一个成员函数,那么你应该在基础类别中把此函 数设为virtual。
2、以单一指令唤起不同函数,这种性质称为Polymorphism,意思是"the ability to assume
many forms",也就是多态。
3、既然抽象类别中的虚拟函数不
打算被调用,我们就不应该定义它,应该把它设为纯虚拟函数(在函数声明之后加上"=0" 即可)
4、抽象类别不能产生出对象实体,但是我们可以拥有指向抽象类别之指针,以便于操作抽象类别的各个衍生类别。
虚拟函数衍生下去仍为虚拟函数,而且可以省略virtual 关键词。
*/
#include "stdafx.h"
#include <iostream>
using namespace std;
class A
{
public:
virtual void Serialize() { cout<<"A::Serial() //n"; }
};
class B: public A
{
public :
int m_data1 ;
void func()
{
cout<<"B::func()"<<endl;
Serialize();
}
virtual void Serialize() { cout<<"B::Serial() //n"; }
void OutputName(){ cout<<"B /n/n"; }
};
class C : public B
{
public:
int m_data2;
virtual void Serialize(){ cout<<"C::Serialize() //n"; }
void OutputName(){ cout<<"C /n/n"; }
};
int main(void){
C myDoc ;
C* pMyDoc = new C();
cout<<"#1 testing"<<endl;
myDoc.func();
//由于子类C中已经重写了父类的Serialize(),所以都会最终落实到对子类C::Serialize()的调用
cout<<"#2 testing"<<endl;
((B*)(&myDoc))->func();
cout<<"#3 testing"<<endl;
pMyDoc->func();
//这里直接把C类型对象upcast强制转化为了B类型对象(对象切割)。
cout<<"#4 testing"<<endl;
((B)myDoc).func();
//虚函数 调用
A* array[]={
new A(),
new B(),
new C()
};
int arraySize = sizeof(array)/sizeof(*array[0]); //3
cout<<arraySize<<endl;
for(int i=0 ; i < arraySize ; i++)
array[i]->Serialize();
B* cb;
C cc;
cb = &cc;
cb->OutputName();
cc.OutputName();
return 0;
}