小小白学C++之多态以及抽象类

本文详细介绍了多态的概念,区分了静态多态和动态多态,重点讲解了虚函数和抽象类的使用,以及它们在实现多态中的作用。同时,通过实例演示了如何利用纯虚函数创建抽象类和单例模式的应用。

1.多态

1.1多态介绍

多态:顾名思义,多种形态,同一行为,当不同的对象去完成时会产生不同的状态。比如:“输出1·10指令”,有的人用for循环,有的人用while循环

人类——身份——人类

学生类——学生

教师类——教师

2.多态类型

多态分为:静态多态 和 动态多态

静态多态:在编译时就可以确定对象的使用,比如:函数重载,同一个函数名不同形参,调用形式各种各样。(这个是在编译时实现的)

多半一般指动态多态。

动态多态:一个父类的引用或指针去调用同一个函数,传递不同的对象,会调用不同的函数。(这个是在运行时实现的)

多态可以通过:虚函数、抽象类、覆盖、模版 来实现

3.多态构成多态的条件

1. 必须通过基类的指针或者引用调用"""虚函数"""。

2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。

3. 基类使用了虚函数,基类的派生类中同名函数也自动成为了虚函数。

4.虚函数

虚函数:被virtual修饰的类成员函数,不能是静态成员或普通函数,以及不能是构造函数。

格式:

class 类名

{

        virtual 类型 函数名(形参)

        {

        }

};

!!(通过对虚函数重写实现多态)!!

例子:人类 学生类 教师类 --- 实现身份认证

#include<iostream>

using namespace std;

class Person
{
public:
	// 成员数据 
	int age;
	// 构造函数 
	Person(int a=0)
	{
		age = a;
	}
	// 虚函数 
	virtual void show()
	{
		cout << "人类:age-" << age << endl;
	}	
};

class Student:public Person
{
public:
	Student(int x=0)
	{
		age = x;
	}
	void show()
	{
		cout << "学生:age"  << age << endl; 
	}
};

class Teacher:public Person
{
public:
	Teacher(int x=0)
	{
		age = x;
	}
	void show()
	{
		cout << "老师:age"  << age << endl; 
	}
};

// 函数
void test(Person *pp)
{
	// 这个函数对于老师或者学生都可以用,
	// 如果传递的是老师对象就用老师的show
	// 如果传递学生对象就用学生的show
	
	// 形参怎么写?
	pp->show();
	 
} 

int main()
{
	Teacher t(30);
	Student s(23);
	
	Person *p = &t;
	p->show();
	
	p = &s;
	p->show();
	
	test(&t);
	test(&s);
	
	Person a;
	test(&a);
	 
	return 0;
}

2. 抽象类

2.1 抽象类定义

抽象类的定义就是,含有“”“纯虚函数”“”的类,可以包含多个虚函数。

抽象类:

1、包含純虚函数的类

2、构造函数写在protected和private权限下。

纯虚函数:当在基类无法为虚函数提供任何有实际意义的定义时,可以将虚函数声明为纯虚函数,它的实现留给派生类去做。

此外,只定义了protected或private型构造函数的类也是抽象类,不能通过类名 + 对象名创建对象,只能通过静态成员方法的形式创建对象。

2.2 纯虚函数

纯虚函数的格式:

class 类名

{

        virtual 类型 函数名(形参) = 0;

};

纯虚函数不能直接被调用,它只提供了一个接口,子类必须实现这个接口。

tips:

1、純虚函数必须要在子类里面实现

2、包含純虚函数的类叫抽象类,不能用抽象类创建对象。

2.3拓展

只定义了protected或private型构造函数的抽象类

例:实现单例模式 --- 保证整个系统中一个类只有一个对象的实例,实现这种功能的方式就叫单例模式

#include<iostream> 

using namespace std;
#include<iostream> 

using namespace std;

//打印机单例模式
class Printer {
public:
	//对外接口
	static Printer* getInstance() {
		return printer;
	}
	//打印功能
	void printText(string text) {
		cout << text << endl;
	}
private:
	// 构造函数私有化
	Printer() {};
	Printer(const Printer& p) {};
	//类内声明对象指针
	static Printer* printer;
};
 
//类外初始化
Printer* Printer::printer = new Printer;

int main()
{	
	Printer *p = Printer::getInstance();
	p->printText("hello world");	
	
	Printer *p1 = Printer::getInstance();
	p1->printText("hello world");	
	
	cout << p << p1 << endl; 
	
	return 0;
}

单例模式的应用场景包括全局配置管理、日志记录、缓存管理等...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值