c++------多态

目录

一、静态联编和动态联编

二、虚函数原理剖析

三、纯虚函数和抽象类

四、向上向下类型转换

 五、重载、重写、重定义


一、静态联编和动态联编

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

class Animal {
public:
	virtual void speak()
	{
		cout << "动物在说话" << endl;
	}
};
class Cat : public Animal {
public:
	void speak()
	{
		cout << "小猫在说话" << endl;
	}
};
class Dog : public Animal {
public:
	void speak()
	{
		cout << "小狗在说话" << endl;
	}
};

//多态动态产生条件
//先有继承关系
//父类中有虚函数	子类重写父类虚函数
//父类的指针或者引用	指向子类的对象

//对于有父子关系的两个类	指针或者引用	可以直接转换
void DoSpeak(Animal &animal)
{
	//如果地址早就绑定好了	地址早绑定	属于静态联编
	//如果想调用小猫说话 这个时候函数的地址就不能早绑定了 而是在运行阶段再去绑定函数的地址	属于地址晚绑定	动态联编
	animal.speak();
}
void test01()
{
	Cat cat;
	Dog dog;
	DoSpeak(cat);
	DoSpeak(dog);
}

int main()
{
	test01();

	system("pause");
	return EXIT_SUCCESS;
}

二、虚函数原理剖析

三、纯虚函数和抽象类

 借用前面的计算器案例

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

//设计原则	开闭原则
//对扩展进行开放	对修改进行关闭
class AbstractCalculator {
public:
	//纯虚函数	
	//如果一个类中包含了纯虚函数	那么这个类就无法实例化对象	这个类通常称为抽象类
	//抽象类的子类	必须重写父类中的纯虚函数	否则这个子类也是抽象类
	virtual int GetResult() = 0;
	//virtual int GetResult()
	//{
	//	return 0;
	//}
	int m_A;
	int m_B;
};

class Test : public AbstractCalculator {
public:

};

//加法
class AddCalculator : public AbstractCalculator {
public:
	int GetResult()
	{
		return m_A + m_B;
	}
};

//减法
class SubCalculator : public AbstractCalculator {
public:
	int GetResult()
	{
		return m_A - m_B;
	}
};

//乘法
class MulCalculator : public AbstractCalculator {
public:
	int GetResult()
	{
		return m_A * m_B;
	}
};

void test01()
{
	AbstractCalculator* calculator = new AddCalculator;
	calculator->m_A = 10;
	calculator->m_B = 20;
	cout << "加法实现结果:" << calculator->GetResult() << endl;

	calculator = new SubCalculator;
	calculator->m_A = 10;
	calculator->m_B = 20;
	cout << "减法实现结果:" << calculator->GetResult() << endl;

	calculator = new MulCalculator;
	calculator->m_A = 10;
	calculator->m_B = 20;
	cout << "乘法实现结果:" << calculator->GetResult() << endl;
}

int main()
{
	//test01();
	//AbstractCalculator abc;	//纯虚函数无法实例化对象
	//Test t;	//没有重写纯虚函数的子类也无法实例化对象 
	system("pause");
	return EXIT_SUCCESS;
}

四、向上向下类型转换

 五、重载、重写、重定义

 重载

重写

 重定义

 

class A{
public:
	//同一作用域下,func1函数重载
	void func1(){}
	void func1(int a){}
	void func1(int a,int b){}
	void func2(){}
	virtual void func3(){}
};

class B : public A{
public:
	//重定义基类的func2,隐藏了基类的func2方法
	void func2(){}
	//重写基类的func3函数,也可以覆盖基类func3
	virtual void func3(){}
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值