c++ 多态(简单易懂)

##c++ 多态:

多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。

C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。

demo:

#include "stdafx.h"

#include <iostream>


class Father {


protected:
	int money = 100;

public:
	 void  have() {		
		std::cout << "Father have money:" << money << "$." << std::endl;
	}

};

class Son :public Father {

public:
	void  have() {
		std::cout << "Son have money:" << money << "$." << std::endl;
	}
};

class Daughter :public Father {

public:
	void  have() {
		std::cout << "Daughter have money:" << money << "$." << std::endl;
	}

};




int main()
{	
	Son son_;
	son_.have();

	Daughter dauther_;
	dauther_.have();

	std::cout << "-------------------------" << std::endl;;

	Father* father_ = &son_;
	father_->have();

	father_ = &dauther_;
	father_->have();

	system("pause");
    return 0;
}

这里写图片描述

是不是和想象的输出结果不一样.

原因是,调用函数 have() 被编译器设置为基类中的版本,这就是所谓的静态多态,
或静态链接 - 函数调用在程序执行前就准备好了。有时候这也被称为早绑定,因为 have() 函数在程序编译期间就已经设置好了。

所以我们要改为 动态的多态 后绑定

###虚函数:

虚函数 是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器
不要静态链接到该函数。

我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定。

我们把基类的 have 前面加 virtual virtual void have() 再来执行一下

这里写图片描述
这就对了

此时,编译器看的是指针的内容,而不是它的类型。因此,由于 son_ 和 dauther_类的对象的地址存储在 *father_中,所以会调用各自的 have() 函数

正如您所看到的,每个子类都有一个函数 have() 的独立实现。这就是多态的一般使用方式。有了多态,您可以有多个不同的类,都带有同一个名称但具有不同实现的函数,函数的参数甚至可以是相同的。

	98年菜鸡一枚,请大佬们多多关照!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值