转自:https://www.cnblogs.com/lang5230/p/5320775.html
表现:将算法框架放在抽象基类中,并定义好实现接口,在子类中实现细节接口。
代码实现,含有三个文件
abstract_calss.h
concrete_class.h
main.cpp
// abstract_class.h
#ifndef ABSTRACT_CLASS_H
#define ABSTRACT_CLASS_H
#include <iostream>
// 公司
class Company
{
public:
virtual ~Company() {}
// 校园招聘
void Recruit()
{
std::cout << "---------- Begin ----------" << std::endl;
CareerTalk();
ReceiveResume();
Interview();
Offer();
std::cout << "---------- End ----------" << std::endl;
}
// 宣讲会
void CareerTalk() {
std::cout << "Delivery" << std::endl;
}
// 接收简历
void ReceiveResume() {
std::cout << "Receive Resume" << std::endl;
}
// 面试
virtual void Interview() = 0;
// 发放 Offer
virtual void Offer() = 0;
};
#endif // ABSTRACT_CLASS_H
// concrete_class.h
#ifndef CONCRETE_CLASS_H
#define CONCRETE_CLASS_H
#include "abstract_class.h"
#include <iostream>
// 阿里
class Alibaba : public Company//派生类Alibaba继承自基类Company
{
public:
// virtual void Interview() override {
void Interview() {
std::cout << "First interview -> Second interview -> Third interview" << std::endl;
}
//override表示子类覆盖掉父类的方法,调用时会调用子类的方法,父类对应的方法已经用virtual修饰。
virtual void Offer() override { //如果派生类在虚函数声明时使用了override描述符,那么该函数必须重载其基类中的同名函数,否则代码将无法通过编译
std::cout << "30W" << std::endl;
}
};
// 腾讯
class Tencent : public Company//派生类Tencent也继承自基类Company
{
public:
virtual void Interview() override {
std::cout << "First interview -> Second interview" << std::endl;
}
virtual void Offer() override {
std::cout << "25W" << std::endl;
}
};
#endif // CONCRETE_CLASS_H
//mani.cpp
#include "concrete_class.h"
#ifndef SAFE_DELETE
#define SAFE_DELETE(p) { if(p){delete(p); (p)=NULL;} }
#endif
int main()
{
// 阿里校招
Company *alibaba = new Alibaba();//类的指针,用的是内存堆,是个永久变量,除非你释放它,需要用new运算符分配内存
alibaba->Recruit();
// 腾讯校招
Company *tencent = new Tencent();
tencent->Recruit();
SAFE_DELETE(tencent);
SAFE_DELETE(alibaba);
getchar();
return 0;
}