0
9

# 多态小案例

• C面向接口编程和C多态
• 函数类型语法基础
• 函数指针做函数参数(回调函数)思想剖析
• 函数指针做函数参数两种用法（正向调用、反向调用）
• 纯虚函数 抽象类
• 抽象类基本概念
• 抽象类在多继承中的应用
• 面向抽象类编程案例强化
• 面向抽象类编程案例强化
• 抽象类在多继承中的应用
• 抽象类基本概念

## 多态图形案例

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

using namespace std;

//抽象的图形类
class Shape
{
public:
//打印出图形的基本你属性
virtual void show() = 0;
//得到图形的面积
virtual double getArea() = 0;

virtual ~Shape() {

}
};

//圆类
class Circle :public Shape
{
public:
Circle(double r) {
this->r = r;
}

//打印出图形的基本你属性
virtual void show()  {
cout << "圆的半径是 " << r << endl;
}
//得到图形的面积
virtual double getArea()  {
cout << "获取圆的面积" << endl;
return this->r*this->r *3.14;
}
~Circle() {
cout << "圆的析构函数。。" << endl;
}
private:
double r;
};

class Square :public Shape
{
public:
Square(double a) {
this->a = a;
}

//打印出图形的基本你属性
virtual void show() {
cout << "正方形的边长是" << this->a << endl;
}
//得到图形的面积
virtual double getArea() {
cout << "得到正方形的面积" << endl;
return a*a;
}

~Square() {
cout << "正方形的析构函数" << endl;
}
private:
double a;
};

int main(void)
{
Shape *array[2] = { 0 };

for (int i = 0; i < 2; i++) {
//生成一个圆
if (i == 0) {
double r;
cout << "请输入圆的半径" << endl;
cin >> r;
array[i] = new Circle(r);
}
//生成一个正方形
else {
double a;
cout << "请输入正方形的边长" << endl;
cin >> a;
array[i] = new Square(a);
}
}

//遍历这个array数组
for (int i = 0; i < 2; i++) {
array[i]->show();
cout << array[i]->getArea() << endl;

delete array[i];
}

return 0;
}

## 多态案例-程序员工资

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

using namespace std;

class Programmer
{
public:
Programmer(double salary)
{
this->salary = salary;
}
virtual void printMoney() = 0;
virtual ~Programmer() {

}

protected:
double salary;
};

class Junior_programmer :public Programmer
{
public:
Junior_programmer(double salary) :Programmer(salary) {

}
virtual void printMoney(){
cout << "初级程序员的工资是" << this->salary << endl;
}
};

class Mid_programmer :public Programmer
{
public:
Mid_programmer(double salary) :Programmer(salary) {

}
virtual void printMoney(){
cout << "中级程序员的工资是" << this->salary << endl;
}
};

{
public:

}
virtual void printMoney(){
cout << "高级程序员的工资是" << this->salary << endl;
}
};

int main(void)
{

Programmer * pro1 = new Junior_programmer(12000);

pro1->printMoney();

delete pro1;

Programmer * pro2 = new Mid_programmer(15000);
pro2->printMoney();
delete pro2;

pro3->printMoney();
delete pro3;

return 0;
}

## 数组类型和数组指针

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

using namespace std;

//方法一： 直接定义一个数组类型
typedef int(ARRAY_INT_10)[10];

//方法二：
typedef int(*ARRAY_INT_10_P)[10];

int main(void)
{
int array[10]; //array 应该是一个指向int类型指针。

//方法一：
//ARRAY_INT_10 *array_10_p = &array; //? *array_10_p === array

//方法二：
ARRAY_INT_10_P array_10_p = &array;

for (int i = 0; i < 10; i++) {
(*array_10_p)[i] = i + 10;
}

for (int i = 0; i < 10; i++) {
cout << array[i] << endl;
}

//方法三：
int(*p)[10] = &array;

cout << "------" << endl;
for (int i = 0; i < 10; i++) {
cout << (*p)[i] << endl;
}

return 0;
}

## 函数指针

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

using namespace std;

int func(int a, int b)
{
cout << " 1999 年写的 func" << endl;

return 0;
}

int func2(int a, int b)
{
cout << "1999 写的 func2" << endl;
return 0;
}

int func3(int a, int b)
{
cout << "1999年 写的 func3 " << endl;
return 0;
}

//2018想添加一个新的子业务
int new_func4(int a, int b)
{
cout << "2018 新写的子业务" << endl;
cout << "a = " << a << ", b = " << b << endl;
return 0;
}

//方法一：  函数的返回值， 函数的参数列表（形参的个数，类型，顺序）
//定义一个函数类型。

typedef int(FUNC)(int, int);

//方法二：   定义一个函数指针
typedef int(*FUNC_P)(int, int);

//定义一个统一的接口 将他们全部调用起来。

void my_funtion(int(*fp)(int, int), int a, int b)
{
cout << "1999年实现这个架构业务" << endl;
cout << "固定业务1" << endl;
cout << "固定业务2" << endl;

fp(a, b);//可变的业务

cout << "固定业务3" << endl;

}

int main(void)
{
#if 0
//方法一：
FUNC *fp = NULL;

fp = func;
fp(10, 20);

FUNC_P fp2 = NULL;

fp2 = func;

fp2(100, 200);

//方法三：
int(*fp3)(int, int)   = NULL;
fp3 = func;
fp3(1000, 3000);
#endif
my_funtion(func, 10, 20);
my_funtion(func2, 100, 200);
my_funtion(func3, 1000, 2000);

my_funtion(new_func4, 2000, 3000);

return 0;
}

## 锦囊妙计

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <fstream>

using namespace std;
//-------------抽象层------------
//定义拆开锦囊方法的类型。
typedef void(TIPS)(void);

//定义锦囊
struct tip
{
char from[64]; //谁写的
char to[64];//写给谁的。
//锦囊的内容
TIPS *tp;//相当于抽象类的 纯虚函数.
};

//需要一个打开锦囊的架构函数
void open_tips(struct tip *tip_p)
{
cout << "打开了锦囊" << endl;
cout << "此锦囊是由" << tip_p->from << "写给 " << tip_p->to << "的。" << endl;
cout << "内容是" << endl;
tip_p->tp(); //此时就发生了多态现象。
}

//提供一个创建一个锦囊的方法
struct tip* create_tip(char*from, char *to, TIPS*tp)
{
struct tip *temp = (struct tip*)malloc(sizeof(struct tip));
if (temp == NULL) {
return NULL;
}
strcpy(temp->from, from);
strcpy(temp->to, to);
//给一个回调函数赋值， 一般称 注册回调函数
temp->tp = tp;

return temp;
}

//提供一个销毁锦囊的方法
void destory_tip(struct tip *tp)
{
if (tp != NULL) {
free(tp);
tp = NULL;
}
}

// ------------- 实现层------------
//诸葛亮写了3个锦囊
void tip1_func(void)
{
cout << "一到东吴就拜会乔国老" << endl;
}

void tip2_func(void)
{
cout << "如果主公乐不思蜀，就谎称曹贼来袭。赶紧回来 " << endl;
}

void tip3_func(void)
{
cout << "如果被孙权追杀，向孙尚香求救" << endl;
}

void tip4_func(void)
{
cout << "如果求救孙尚香都不灵，  你们去死了， 我是蜀国老大了" << endl;
}

//---------------  业务层-----------------
int main(void)
{
//创建出3个锦囊
struct tip *tip1 = create_tip("孔明", "赵云", tip1_func);
struct tip *tip2 = create_tip("孔明", "赵云", tip2_func);
struct tip *tip3 = create_tip("孔明", "赵云", tip3_func);
struct tip *tip4 = create_tip("庞统", "赵云", tip4_func);

//由赵云进行拆锦囊。
cout << "刚刚来到东吴， 赵云打开第一个锦囊" << endl;
open_tips(tip1);
cout << "-----------" << endl;

cout << "刘备乐不思蜀， 赵云打开第二个锦囊" << endl;
open_tips(tip2);
cout << "-----------" << endl;

cout << "孙权大军追杀，赵云打开第三个锦囊" << endl;
open_tips(tip3);
cout << "-----------" << endl;

cout << "赵云发现，实在是杀不动了， 打开了第四个锦囊" << endl;
open_tips(tip4);

destory_tip(tip1);
destory_tip(tip2);
destory_tip(tip3);
destory_tip(tip4);

return 0;
}

<