多態小案例
- 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;
}