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

/*
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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值