父类指针的步长和子类指针的步长是不一样的

当用父类指针或者引用指向子类对象时,可以发生多态(是因为有vptr指针和虚函数表的存在),但是这个指针和子类指针的步长时不一样,具体看如下代码,特别注意看注释。

代码如下:

#include <iostream>
using namespace std;

//结论:
//多态是用父类指针指向子类对象 和 父类步长++,是两个不同的概念

class Parent
{
public:
	Parent(int a = 0)
	{
		this->a = a;
	}

	virtual void print()
	{
		cout << "我是爹" << endl;
	}

private:
	int a;
};


//成功 ,一次偶然的成功 ,必然的失败更可怕
class Child : public Parent
{
public:
	

	Child(int b = 0) :Parent(0)
	{
		this->b = b;
	}


	virtual void print()
	{
		cout << "我是儿子" << endl;
	}
private:
	int b;
};

void HowToPlay(Parent* base)
{
	base->print(); //有多态发生  //2 动手脚  

}

void main()
{

	Child  c1; //定义一个子类对象
	Parent* pP = NULL;
	Child* pC = NULL;

	Child  array[] = { Child(1), Child(2), Child(3) };
	pP = array;
	pC = array;

	pP->print();
	pC->print(); //多态发生

	pP++;
	pC++;
	//pP->print();  执行这句话会报错,父类指针和子类指针是不一样的
	pC->print(); //多态发生

	cout << "hello..." << endl;
	system("pause");
	return;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值