一、基本概念
多态是C++面向对象三大特性之一
多态分为两类
-
静态多态: 函数重载 和 运算符重载属于静态多态,复用函数名
-
动态多态: 派生类和虚函数实现运行时多态
静态多态和动态多态区别:
- 静态的多态:函数重载,看起来调用同一个函数却有不同的行为。静态:原理是编译时实现。
- 动态的多态:一个父类的引用或指针去调用同一个函数,传递不同的对象,会调用不同的函数。动态:原理是运行时实现。
二、动态多态
具体操作:用父类的引用或者指针调用不同子类对象,实现不同子类的功能。例如:
#include<iostream>
using namespace std;
class Person {
public:
string m_Name;
int m_Age;
virtual void speak() {
cout << "人类在发言" << endl;
}
};
class Teacher:public Person {
public:
void speak() {
cout << "老师在发言" << endl;
}
};
class Student :public Person {
public:
void speak() {
cout << "学生在发言" << endl;
}
};
void dospeak(Person& p) {
p.speak();
}
void test01() {
Teacher t;
dospeak(t);
Student s;
dospeak(s);
}
int main(int argc, char const **argv) {
test01();
return 0;
}
- 老师在发言
- 学生在发言
此代码中,老师类和学生类分别都继承了人类,人类中有一个speak()方法,且有virtual修饰。这个关键字意思是:虚拟的。也就是在人类中,有一个虚speak()函数,在老师类和学生类中分别重写了这个函数。子类中通过对基类虚函数的重写(函数原型完全一致),实现动态多态。
总结:
多态满足条件
-
有继承关系
-
子类重写父类中的虚函数
多态使用条件
-
父类指针或引用指向子类对象
重写:函数返回值类型 函数名 参数列表 完全一致称为重写
三、多态的优点
多态的优点:
-
代码组织结构清晰
-
可读性强
-
利于前期和后期的扩展以及维护
#include<iostream> using namespace std; //计算器类 class Counter { public: int m_A; int m_B; virtual int getresult() { return 0; } }; //加法类 class Add :public Counter { public: Add(int a,int b) { m_A = a; m_B = b; } int getresult() { return m_A + m_B; } }; //减法类 class Sub :public Counter { public: Sub(int a,int b) { m_A = a; m_B = b; } int getresult() { return m_A - m_B; } }; //多态调用不同方法 void doWork(Counter* c) { cout << c->getresult() << endl; } void test01() { int a, b; char c; cout << "请输入要进行的计算:" << endl; cin >> a >> c >> b; Counter *ptrcount = NULL; switch (c) { case '+':ptrcount = new Add(a, b); break; case '-':ptrcount = new Sub(a, b); break; } doWork(ptrcount); delete ptrcount; } int main(int argc, char const **argv) { test01(); return 0; }
例中代码,可不动核心代码情况下通过加入乘除法类实现乘除法,方便扩展维护。