C++ 多态,虚函数

虚函数和多态
  1.基本概念
如果在类中某个成员函数被定义为虚函数,那么在该类的派送类中如果拥有与基类虚函数函数原型相同的函数同样为虚函数,并且与其基类中的版本构成覆盖关系。
    一个指向子类的基类指针或引用子类的基类引用,调用虚函数,若基类的虚函数被子类的覆盖,则调用子类版本而非基类版本,否则调用基类版本,这种语法称为多态。
  2.覆盖的条件
    成员函数 + 虚函数 + 签名相同
返回基本类型或者对象:必须相同
返回类类型的指针或者引用:允许协变(虚函数之间的返回类型不一样,但存在继承关系,允许返回基类指针或引用)
  3.多态的条件
    虚函数和覆盖 + 指针(this)/引用
在构造和析构函数中调用自己虚函数没有多态性。


  注意:在构造和析构函数中调用自己虚函数没有多态性。根据this的指向,决定调用的版本!!


#include <iostream>
using namespace std;

class Base
{
public:
	Base(void) 
	{
		// 基类尚未完成构造,this此刻的指向是基类的。
		// 构造函数中调用自己的虚函数不存在多态
		foo();
		bar();
		cout << "Base构造结束" << endl;
	}

	virtual void foo(void)
	{
		cout << "Base::foo()" << endl;
	}

	virtual void bar(void)
	{
		cout << "Base::bar()" << endl;
	}
	
	void func(void)
	{
		// 虽然func不是虚函数,但是仍然存在this指针,存在多态
		cout << "Base::func()" << endl;
		// foo函数和bar函数根据this指针的指向,调用对应版本的虚函数
		foo();
		bar();
	}

	virtual ~Base(void)
	{
		// 同理,析构中子类已被析构,this制作仍然指向基类
		// 析构函数中同样调用自己的虚函数不存在多态
		cout << "Base析构开始" << endl;
		foo();
		bar();
	}
};

class Derive : public  Base
{
public:
	virtual void foo(void)
	{
		cout << "Derive::foo()" << endl;
	}
	virtual void bar(void)
	{
		cout << "Derive::bar()" << endl;
	}
};

int main(void)
{
	Base *p = new Derive();
	p->func(); // p指向Derive,则func里的this指针指向Derive,调用的是Derive版本的虚函数
	delete p;

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值