C++:抽象类

例子:有一个老师类,有一个语文课的类

#include <iostream>
using namespace std;

class Chinese
{
public:
	void Begin()
	{
		cout << "Let's begin Chinese lesson..." << endl;
	}
};

class Teacher
{
public:
	void StartLesson(Chinese* lesson)
	{
		lesson->Begin();
	}
};

int main()
{
	Chinese chinese;
	Teacher teacher;
	teacher.StartLesson(&chinese);
	return 0;
}

将语文课的实例作为参数传给老师类的StartLesson方法 ,老师开始上语文课。

老师还可能上英语课(这个学校就一个全能老师),这个时候就需要再添加一个英语课的类。

#include <iostream>
using namespace std;

class Chinese		
{
public:
	void Begin()
	{
		cout << "Let's begin Chinese lesson..." << endl;
	}
};

class English											//++			
{														//++
public:													//++
	void Begin()										//++
	{													//++
		cout << "Let's begin English lesson..." << endl;//++
	}													//++
};

class Teacher
{
public:
	void StartLessonChinese(Chinese* lesson)			 //+-
	{													 //+-
		lesson->Begin();								 //+-
	}													 //+-
	void StartLessonEnglish(English* lesson)			 //++
	{													 //++
		lesson->Begin();								 //++
	}													 //++
};

int main()
{
	Chinese chinese;
	English english;
	Teacher teacher;
	teacher.StartLessonChinese(&chinese);
	teacher.StartLessonEnglish(&english);
	return 0;
}

显然,当课程变多后,这样不是个好办法。怎么办呢,可以增加一个抽象层,老师类只依赖课程这个抽象层,不再是具体的哪门课,这样,当课程增加时,老师类不需要修改,只需在课程抽象层的底层,也就是具体课程里面添加一个类

 

#include <iostream>
using namespace std;

//基类
class Lesson
{
public:
	virtual void Begin() = 0;
};

//派生类
class Chinese : public Lesson		
{
public:
	void Begin()
	{
		cout << "Let's begin Chinese lesson..." << endl;
	}
};
//派生类
class English : public Lesson									
{														
public:													
	void Begin()										
	{													
		cout << "Let's begin English lesson..." << endl;
	}													
};

class Teacher
{
public:
	void StartLesson(Lesson* lesson)
	{										
		lesson->Begin();					
	}										
};

int main()
{
	Chinese chinese;
	English english;
	Teacher teacher;
	teacher.StartLesson(&chinese);
	teacher.StartLesson(&english);
	return 0;
}

这样一来,以后再增加新的课程时,只需要

class Math :public Lesson
{
public:
	void Begin()
	{
		cout << "Let's begin Math lesson..." << endl;
	}
};

 

然后再实际使用的时候,可以生成为DLL,将其接口放到头文件中,只暴露接口

BaseClass.h

#pragma once
#ifndef LOADMYDLL
#define MY_HEAD_API __declspec(dllexport)
#else
#define MY_HEAD_API __declspec(dllimport)
#endif

//基类
class MY_HEAD_API Lesson
{
public:
	virtual void Begin() = 0;
};

//派生类
class MY_HEAD_API Chinese : public Lesson
{
public:
	void Begin();
};
//派生类
class MY_HEAD_API English : public Lesson
{
public:
	void Begin();
};

class MY_HEAD_API Math :public Lesson
{
public:
	void Begin();
};

class MY_HEAD_API Teacher
{
public:
	void StartLesson(Lesson* lesson);
};

 BaseClass.cpp

#include <iostream>
using namespace std;
#include "BaseClass.h"

void Chinese::Begin()
{
	cout << "Let's begin Chinese lesson..." << endl;
}
void English::Begin()
{
	cout << "Let's begin English lesson..." << endl;
}
void Math::Begin()
{
	cout << "Let's begin Math lesson..." << endl;
}

void Teacher::StartLesson(Lesson* lesson)
{
	lesson->Begin();
}

另外一个项目中测试:将.lib文件放到项目源文件所在路径,.dll放到生成路径下

【当然也可以在测试项目中将dll和lib添加到属性中】

#include <iostream>
using namespace std;
#include "BaseClass.h"
#pragma comment(lib, "MyDll0813.lib")  
int main()
{
	Chinese chinese;
	English english;
	Math math;
	Teacher teacher;
	teacher.StartLesson(&chinese);
	teacher.StartLesson(&english);
	teacher.StartLesson(&math);
	return 0;
}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值