C++中的多态、虚函数、父类子类

/*
C++中的多态、虚函数、父类子类

1、 如果你期望衍生类别重新定义一个成员函数,那么你应该在基础类别中把此函 数设为virtual。
2、以单一指令唤起不同函数,这种性质称为Polymorphism,意思是"the ability to assume many forms",也就是多态。
3、既然抽象类别中的虚拟函数不打算被调用,我们就不应该定义它,应该把它设为纯虚拟函数(在函数声明之后加上"=0" 即可)
4、抽象类别不能产生出对象实体,但是我们可以拥有指向抽象类别之指针,以便于操作抽象类别的各个衍生类别。
虚拟函数衍生下去仍为虚拟函数,而且可以省略virtual 关键词。
*/

#include "stdafx.h"
#include

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()"< 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"< myDoc.func();

//由于子类C中已经重写了父类的Serialize(),所以都会最终落实到对子类C::Serialize()的调用
cout<<"#2 testing"< ((B*)(&myDoc))->func();

cout<<"#3 testing"< pMyDoc->func();

//这里直接把C类型对象upcast强制转化为了B类型对象(对象切割)。
cout<<"#4 testing"< ((B)myDoc).func();

//虚函数 调用
A* array[]={
new A(),
new B(),
new C()
};
int arraySize = sizeof(array)/sizeof(*array[0]); //3
cout<
for(int i=0 ; i < arraySize ; i++)
array[i]->Serialize();


B* cb;
C cc;

cb = &cc;
cb->OutputName();
cc.OutputName();

return 0;
}

你可能感兴趣的:(C++)