C++——多态

一、基本概念

多态是C++面向对象三大特性之一

多态分为两类

  • 静态多态: 函数重载 和 运算符重载属于静态多态,复用函数名

  • 动态多态: 派生类和虚函数实现运行时多态

静态多态和动态多态区别:

  • 静态的多态:函数重载,看起来调用同一个函数却有不同的行为。静态:原理是编译时实现。
  • 动态的多态:一个父类的引用或指针去调用同一个函数,传递不同的对象,会调用不同的函数。动态:原理是运行时实现。

二、动态多态

具体操作:用父类的引用或者指针调用不同子类对象,实现不同子类的功能。例如:

#include
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
    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;
    }

    例中代码,可不动核心代码情况下通过加入乘除法类实现乘除法,方便扩展维护。

     

你可能感兴趣的:(c++,开发语言)