多态是面向对象的三大特性之一
多态分为两类
静态多态和动态多态的区别
动态多态必须满足的条件
父类指针或者引用指向子类对象
重写:函数名 参数列表 函数返回值类型 完全一致
#include
using namespace std;
//子类可以转父类,父类不能转子类
//动物类
class Animal {
public:
void speak()
{
cout << "动物在说话" << endl;
}
};
//猫类
class Cat :public Animal {
public:
void speak()
{
cout << "猫在说话" << endl;
}
};
//执行说话的函数
//地址早绑定,在编译阶段就确定了函数地址
void doSpeak(Animal &animal)//Animal &animal=cat
{
animal.speak();
}
void test01()
{
Cat cat;
doSpeak(cat);
}
//分别利用普通写法和多态技术实现计算器
//普通写法class Calculator
int main()
{
test01();
system("pause");
return 0;
}
#include
using namespace std;
//子类可以转父类,父类不能转子类
//动物类
class Animal {
public:
virtual void speak()
{
cout << "动物在说话" << endl;
}
};
//猫类
class Cat :public Animal {
public:
void speak()
{
cout << "猫在说话" << endl;
}
};
//执行说话的函数
//地址早绑定,在编译阶段就确定了函数地址
void doSpeak(Animal &animal)//Animal &animal=cat
{
animal.speak();
}
void test01()
{
Cat cat;
doSpeak(cat);
}
//分别利用普通写法和多态技术实现计算器
//普通写法class Calculator
int main()
{
test01();
system("pause");
return 0;
}
案例描述:
分别利用普通写法和多态技术,设计实现两个操作数进行运算的计算器类
多态的优点:
对比传统写法和使用多态
#include
#include
using namespace std;
//子类可以转父类,父类不能转子类
//动物类
//class Animal {
//
//public:
// virtual void speak()
// {
//
// cout << "动物在说话" << endl;
//
// }
//
//};
//
//
猫类
//class Cat :public Animal {
//public:
// virtual void speak()
// {
// cout << "猫在说话" << endl;
// }
//
//};
//
执行说话的函数
地址早绑定,在编译阶段就确定了函数地址
//void doSpeak(Animal &animal)//Animal &animal=cat
//{
//
// animal.speak();
//
//}
//
//
//void test01()
//{
// Cat cat;
// doSpeak(cat);
//
//
//
//}
//多态的好处
//1.组织结构清晰
//2.可读性比较强
//3.对于前期和后期的扩展和维护性比较高
//分别利用普通写法和多态技术实现计算器
//普通写法class Calculator---不利于维护
class Calculator
{
//实现两个操作数运算
public:
int getResult(string opt)//传入操作符
{
if (opt == "+")
{
return m_Num1 + m_Num2;
}
else if (opt == "-")
{
return m_Num1 - m_Num2;
}
else if (opt == "*")
{
return m_Num1 * m_Num2;
}
}
int m_Num1;
int m_Num2;
};
//测试案例
void test01()
{
//创建计算器对象
Calculator c;
c.m_Num1 = 10;
c.m_Num2 = 20;
cout << c.m_Num1 << "+" << c.m_Num2 <<"="<< c.getResult("+") << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
#include
#include
using namespace std;
//子类可以转父类,父类不能转子类
//动物类
//class Animal {
//
//public:
// virtual void speak()
// {
//
// cout << "动物在说话" << endl;
//
// }
//
//};
//
//
猫类
//class Cat :public Animal {
//public:
// virtual void speak()
// {
// cout << "猫在说话" << endl;
// }
//
//};
//
执行说话的函数
地址早绑定,在编译阶段就确定了函数地址
//void doSpeak(Animal &animal)//Animal &animal=cat
//{
//
// animal.speak();
//
//}
//
//
//void test01()
//{
// Cat cat;
// doSpeak(cat);
//
//
//
//}
//多态的好处
//1.组织结构清晰
//2.可读性比较强
//3.对于前期和后期的扩展和维护性比较高
//分别利用普通写法和多态技术实现计算器
//普通写法class Calculator
class Calculator
{
//实现两个操作数运算
public:
int getResult(string opt)//传入操作符
{
if (opt == "+")
{
return m_Num1 + m_Num2;
}
else if (opt == "-")
{
return m_Num1 - m_Num2;
}
else if (opt == "*")
{
return m_Num1 * m_Num2;
}
return -1;
}
int m_Num1;
int m_Num2;
};
//测试案例
void test01()
{
//创建计算器对象
Calculator c;
c.m_Num1 = 10;
c.m_Num2 = 20;
cout << c.m_Num1 << "+" << c.m_Num2 << "=" << c.getResult("+") << endl;
}
//利用多态实现计算器
//实现计算器抽象类
class AbstractCalculator {
public:
int m_Num1;
int m_Num2;
virtual int getResult()//在父类虚函数中不实现任何功能
{
return 0;
}
};
//设计加法计算器类
class AddCalculator :public AbstractCalculator
{
public:
virtual int getResult()//在父类虚函数中不实现任何功能
{
return m_Num1 + m_Num2;
}
};
//设计减法计算器类
class SubCalculator :public AbstractCalculator
{
public:
virtual int getResult()//在父类虚函数中不实现任何功能
{
return m_Num1 - m_Num2;
}
};
//设计乘法计算器类
class MultCalculator :public AbstractCalculator
{
public:
virtual int getResult()//在父类虚函数中不实现任何功能
{
return m_Num1 * m_Num2;
}
};
void test02()
{
//多态使用条件
//父类指针或者引用指向子类的对象
//1.加法运算
AbstractCalculator *ptr = new AddCalculator;//C++无参构造可以省略()
ptr->m_Num1 = 10;
ptr->m_Num2 = 200;
cout << ptr->m_Num1 << "+" << ptr->m_Num2 << "=" << ptr->getResult() << endl;
delete ptr;//释放堆区数据
//2.减法运算
ptr = new SubCalculator;
ptr->m_Num1 = 10;
ptr->m_Num2 = 200;
cout << ptr->m_Num1 << "-" << ptr->m_Num2 << "=" << ptr->getResult() << endl;
delete ptr;//释放数据
//3.乘法运算
ptr = new MultCalculator;
ptr->m_Num1 = 100;
ptr->m_Num2 = 200;
cout << ptr->m_Num1 << "*" << ptr->m_Num2 << "=" << ptr->getResult() << endl;
delete ptr;//释放数据
}
int main()
{
//test01();
test02();
system("pause");
return 0;
}