多态使用的注意点

多态使用注意点一:不要在构造析构过程中调用virtual函数

#include <iostream>
using namespace std;

class AA
{
public:
	AA(int a = 0)
	{
		this->a = a;
		print(); //在构造函数里面能实现多态吗?
	}

	//分析一下要想实现多态,c++编译器应该动什么手脚
	//第一个需要动手脚的地方  起码这个函数print 我应该特殊处理
	virtual void print()
	{
		cout << "父类的" << "a = " << a << endl;
	}
protected:
	int a;
};

class BB : public AA
{
public:
	BB(int a = 0, int b = 0)
	{
		this->a = a;
		this->b = b;

	}
	virtual void print()
	{
		cout << "子类的" << "a = " << a << ", b = " << b << endl;
	}
private:
	int b;
};


void howToPrintf(AA *pBase)
{
	//pBase 我怎么知道是父类对象还是子类对象
	//动手脚2::区分是父类对象还是子类对象,提前布局
	pBase->print();  //
}
void main()
{
	//AA a1;
	BB b1;
	//howToPrintf(&a1);
	howToPrintf(&b1);
}


多态使用注意点二:

#include <iostream>
using namespace std;

//指针也是一种数据类型,指针数据的数据类型是指,它所指的内存空间的数据类型
//最后一点引申 指针的步长

class Parent
{
protected:
	int i;
	int		j;
public:
	virtual void func()
	{ 
		cout << "Parent::func()" << endl;
	}
};


class Child : public Parent
{
public:
	//int k;  //注意点
public:
	Child(int i, int j)
	{
		cout << "Child(int i, int j)" << endl;
	}

	virtual void func()
	{
		cout << "Child::func()" << endl;
	}
};

void howToCallFunc(Parent *pBase)
{
	pBase->func();
}

//指针的步长 在c++领域仍然有效,父类指针的步长和子类指针的步长不一样
//多态是靠迟绑定实现的(vptr+函数指针实现)
int main()
{
	int i = 0;
	Parent* p = NULL;
	Child* c = NULL;

	//不要把父类对象还有子类对象同事放在一个数组里面
	Child ca[3] = { Child(1, 2), Child(3, 4), Child(5, 6) };

	//不要用父类指针做赋值指针变量,去遍历一个子类的数组。

	p = ca;
	c = ca;

	p->func();
	c->func(); //有多态发生

	p++;
	c++;

	p->func();//有多态发生
	c->func();

	for (i = 0; i < 3; i++)
	{
		howToCallFunc(&(ca[i]));
	}

	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值