多态小案例

  • 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;
}
}; class Adv_programmer :public Programmer
{
public:
Adv_programmer(double salary) :Programmer(salary) { }
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; Programmer *pro3 = new Adv_programmer(30000);
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;
}

最新文章

  1. Spark程序使用groupByKey后数据存入HBase出现重复的现象
  2. Android Studio 中配置强大的版本管理系统
  3. 轻松认识JVM运行时数据区域(使用思维导图)
  4. JSP学习——原理
  5. 学习面试题Day05
  6. Spark 0.9的安装配置
  7. WIN32读写INI文件方法
  8. 使用区域组织 ASP.NET MVC 应用程序
  9. 多线程中的lua同步问题
  10. Python in minute
  11. FusionCharts使用问题及解决方法(四)-FusionCharts常见问题大全
  12. MySQL中的完整性约束条件(主键、外键、唯一、非空)
  13. sysbench
  14. Algorithms code
  15. Websocket原理及使用场景[转载]
  16. App测试的策略
  17. SpringBoot之整合Mybatis范例
  18. linux/mac下一键删除下载失败的maven jar包
  19. HDU 2176 取(m堆)石子游戏 (尼姆博奕)
  20. 【Tsinsen-A1486】树(王康宁) 点分治 + Trie

热门文章

  1. Stream系列(二)Map方法使用
  2. ctf中关于图片的隐写随笔(不全)
  3. 深入理解.NET Core的基元(三) - 深入理解runtimeconfig.json
  4. Python下定义输出日志
  5. 【Android - 组件】之Activity的启动模式
  6. 小白的springboot之路(六)、跨域解决方案CORS
  7. 相关性不一定等于因果性:从 Yule-Simpson’s Paradox 讲起
  8. C++ 入门第一篇 Hello Word
  9. 这货到底还是不是垃圾?【垃圾回收GC算法JVM篇四】
  10. volatile在外设寄存器基地址定义时的作用