十一. 多态
1.Code
:
#include<iostream>
using namespace std;
class qw
{
public:
virtual void func()
{
cout << "qw virtual void func();" << endl;
}
};
class cat :public qw
{
public:
void func()
{
cout << "cat void func();" << endl;
}
};
class cat1 :public qw
{
public:
void func()
{
cout << "cat1 void func();" << endl;
}
};
void test(qw& qw1)
{
qw1.func();
}
void test1()
{
cat c1;
test(c1);
cat1 c2;
test(c2);
}
class Calculator {
public:
int getResult(string oper)
{
if (oper == "+") {
return m_Num1 + m_Num2;
}
else if (oper == "-") {
return m_Num1 - m_Num2;
}
else if (oper == "*") {
return m_Num1 * m_Num2;
}
}
public:
int m_Num1;
int m_Num2;
};
void test01()
{
Calculator c;
c.m_Num1 = 10;
c.m_Num2 = 10;
cout << c.m_Num1 << " + " << c.m_Num2 << " = " << c.getResult("+") << endl;
cout << c.m_Num1 << " - " << c.m_Num2 << " = " << c.getResult("-") << endl;
cout << c.m_Num1 << " * " << c.m_Num2 << " = " << c.getResult("*") << endl;
}
class Calculator1
{
public:
virtual int Operation()
{
return 0;
}
int num1;
int num2;
};
class AddCalculator1:public Calculator1
{
public:
int Operation()
{
return num1 + num2;
}
};
class SubCalculator1 :public Calculator1
{
public:
int Operation()
{
return num1 - num2;
}
};
class MulCalculator1 :public Calculator1
{
public:
int Operation()
{
return num1 * num2;
}
};
void test2()
{
Calculator1* as = new AddCalculator1;
as->num1 = 10;
as->num2 = 10;
cout << as->num1 << " + " << as->num2 << " = " << as->Operation() << endl;
delete as;
as = new SubCalculator1;
as->num1 = 10;
as->num2 = 10;
cout << as->num1 << " - " << as->num2 << " = " << as->Operation() << endl;
delete as;
as = new MulCalculator1;
as->num1 = 10;
as->num2 = 10;
cout << as->num1 << " X " << as->num2 << " = " << as->Operation() << endl;
delete as;
}
class MakeDrink
{
public:
virtual void BoilWater() = 0;
virtual void PourCup() = 0;
virtual void PutSomething() = 0;
void MakeSteps()
{
BoilWater();
PourCup();
PutSomething();
}
};
class M_Tea :public MakeDrink
{
public:
virtual void BoilWater()
{
cout << "烧水 " << endl;
}
virtual void PourCup()
{
cout << "倒入茶叶和水 " << endl;
}
virtual void PutSomething()
{
cout << "加入牛奶 " << endl << endl;
}
};
class M_Coffee :public MakeDrink
{
public:
virtual void BoilWater()
{
cout << "烧水 " << endl;
}
virtual void PourCup()
{
cout << "倒入咖啡和水 " << endl;
}
virtual void PutSomething()
{
cout << "加入?? " << endl << endl;
}
};
void Func(MakeDrink& qw1)
{
qw1.MakeSteps();
}
void Func1(MakeDrink* dr)
{
dr->MakeSteps();
delete dr;
}
void test3()
{
cout << " 父类引用子类对象 " << endl;
M_Tea M_T1;
M_Coffee M_C1;
Func(M_T1);
Func(M_C1);
cout << " 父类指针指向子类 " << endl;
Func1(new M_Tea);
Func1(new M_Coffee);
}
class sd
{
public:
sd()
{
cout << "sd 构造函数调用" << endl;
}
virtual ~sd() = 0;
};
sd::~sd()
{
cout << "sd 纯虚析构函数" << endl;
}
class er:public sd
{
public:
er(int age)
{
cout << "er 构造函数调用" << endl;
re = new int(age);
}
~er()
{
cout << "er 析构函数调用" << endl;
if (re != NULL)
{
delete re;
re = NULL;
}
}
int* re;
};
void test4()
{
sd* sd1 = new er(18);
delete sd1;
}
class CPU
{
public:
virtual void calculate() = 0;
};
class GraphicsCard
{
public:
virtual void display() = 0;
};
class Memory
{
public:
virtual void storage() = 0;
};
class Computer
{
public:
Computer(CPU* Cp, GraphicsCard* Gr, Memory* Me)
{
C_CP = Cp;
C_Gr = Gr;
C_Me = Me;
}
void work()
{
C_CP->calculate();
C_Gr->display();
C_Me->storage();
}
~Computer()
{
if (C_CP != NULL)
{
delete C_CP;
C_CP = NULL;
}
if (C_Gr != NULL)
{
delete C_Gr;
C_Gr = NULL;
}
if (C_Me != NULL)
{
delete C_Me;
C_Me = NULL;
}
}
private:
CPU* C_CP;
GraphicsCard* C_Gr;
Memory* C_Me;
};
class I_CPU :public CPU
{
public:
virtual void calculate()
{
cout << "Intel的CPU开始计算了!" << endl;
}
};
class I_GraphicsCard :public GraphicsCard
{
public:
virtual void display()
{
cout << "Intel的显卡开始显示了! " << endl;
}
};
class I_Memory :public Memory
{
public:
virtual void storage()
{
cout << "Intel的内存条开始存储了!" << endl;
}
};
class L_CPU :public CPU
{
public:
virtual void calculate()
{
cout << "L 的CPU开始计算了!" << endl;
}
};
class L_GraphicsCard :public GraphicsCard
{
public:
virtual void display()
{
cout << "L 的显卡开始显示了! " << endl;
}
};
class L_Memory:public Memory
{
public:
virtual void storage()
{
cout << "L的内存条开始存储了!" << endl;
}
};
void test5()
{
CPU* I_CPU1 = new I_CPU;
GraphicsCard* GraphicsCard1 = new I_GraphicsCard;
Memory* Memory1 = new I_Memory;
cout << "第一台电脑开始工作:" << endl << endl;
Computer* com1 = new Computer(I_CPU1, GraphicsCard1, Memory1);
com1->work();
delete com1;
cout << "第二台电脑开始工作:" << endl << endl;
Computer* com2 = new Computer(new L_CPU, new L_GraphicsCard, new L_Memory);
com2->work();
delete com2;
cout << "第三台电脑开始工作:" << endl << endl;
Computer* com3 = new Computer(new I_CPU, new L_GraphicsCard, new I_Memory);
com3->work();
delete com3;
}
int main()
{
cout << "C++面向对象的三大特性: 封装 继承 多态" << endl;
cout << "多态 !" << endl;
test1();
cout << "二. 多态案例一: 计算器类" << endl;
test01();
test2();
cout << "三. 多态案例二: 制饮料" << endl;
test3();
cout << "四. 虚析构 和 纯虚析构" << endl;
test4();
cout << "五. 多态案例三: 工作的电脑" << endl;
test5();
system("pause");
return 0;
}
2.运行结果
: