多态小案例

  • 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;
}

c++-多态小案例的更多相关文章

  1. JAVA之旅(八)——多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例

    JAVA之旅(八)--多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例 学习是不能停止的 一.多态 我们今天又要学习一个新的概念了,就是多态,它是面向对象的第 ...

  2. 机械表小案例之transform的应用

    这个小案例主要是对transform的应用. 时钟的3个表针分别是3个png图片,通过setInterval来让图片转动.时,分,秒的转动角度分别是30,6,6度. 首先,通过new Date函数获取 ...

  3. shell讲解-小案例

    shell讲解-小案例 一.文件拷贝输出检查 下面测试文件拷贝是否正常,如果cp命令并没有拷贝文件myfile到myfile.bak,则打印错误信息.注意错误信息中basename $0打印脚本名.如 ...

  4. [jQuery学习系列六]6-jQuery实际操作小案例

    前言最后在这里po上jQuery的几个小案例. Jquery例子1_占位符使用需求: 点击第一个按钮后 自动去check 后面是否有按钮没有选中, 如有则提示错误消息. <html> &l ...

  5. 02SpringMvc_springmvc快速入门小案例(XML版本)

    这篇文章中,我们要写一个入门案例,去整体了解整个SpringMVC. 先给出整个项目的结构图:

  6. React.js入门小案例

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title&g ...

  7. SqlDependency缓存数据库表小案例

    SqlDependency的简介: SqlDependency是outputcache网页缓存的一个参数,它的作用是指定缓存失效的数据库依赖项,可以具体到数据库和表. SqlDependency能解决 ...

  8. JavaScript apply函数小案例

    //回调函数1 function callback(a,b,c) { alert(a+b+c); } //回调函数2 function callback2(a,b) { alert(a+b); } / ...

  9. Session小案例------完成用户登录

    Session小案例------完成用户登录     在项目开发中,用户登陆功能再平常只是啦,当用户完毕username和password校验后.进入主界面,须要在主界面中显示用户的信息,此时用ses ...

随机推荐

  1. (四十五)golang--反射

    反射基本介绍: (1)反射可以在运行时动态获取变量的各种信息,比如变量的类型.类别: (2)如果是结构体变量,还可以获取结构体本身的信息(包括结构体字段.方法): (3)通过反射,可以修改变量的值,可 ...

  2. Java包package之间调用问题-cmd运行窗口编译运行

    问题:在使用了java包机制(package)后,编译出现错误:找不到或无法加载主类 xxx 的错误提示信息(各种编译不通过) 先给演示结果: 编译:javac -d classes src/a/He ...

  3. Apache Thrift 的魅力

    WhyApacheThrift 因为最近在项目中需要集成进来一个Python编写的机器学习算法,但是我的后端主要使用的是SpringCloud技术栈. 于是面临着异构语言之间的通信实现方式的抉择. 因 ...

  4. Java基础常见笔试题总结

    1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件 2.“sta ...

  5. Linux的awk命令详解

    awkawk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,默认以空格为分隔符将每行切片,切开的部分再 ...

  6. 本地存储常用方式 localStorage, sessionStorage,cookie 的区别 和 服务器存储session

    本地存储:把一些信息存储到客户端本地(主要目的有很多,其中有一个就是实现多页面之间的信息共享)       1. 离线缓存(xxx.manifest)  H5处理离线缓存还是存在一些硬伤的,所以真实项 ...

  7. ThinkPHP多表查询之join方法

    现在的目的是要把article_category中的name字段导入到article中去 表yz_article如下 表yz_article_category如下

  8. golang数据结构之队列

    队列可以用数组或链表实现,遵从先入先出. 目录结构: 在main中调用queue包中的属性和方法,如何调用参考另一篇文章: https://www.cnblogs.com/xiximayou/p/12 ...

  9. Javascript实现百度API

    百度地图JavaScript API是一套由JavaScript语言编写的应用程序接口,可帮助您在网站中构建功能丰富.交互性强的地图应用,支持PC端和移动端基于浏览器的地图应用开发,且支持HTML5特 ...

  10. 转:Java transient关键字使用小记

    哎,虽然自己最熟的是Java,但很多Java基础知识都不知道,比如transient关键字以前都没用到过,所以不知道它的作用是什么,今天做笔试题时发现有一题是关于这个的,于是花个时间整理下transi ...