C++中的静态多态和动态多态
今天学习C++时,发现C++中存在静态多态和动态多态
静态多态 => 也称为 编译期多态, 也称为静态绑定或前期绑定(早绑定) => 基于模板编程或者泛型编程的静态多态
动态多态 => 也称为 运行期多态 => 面向对象的动态多态,它基本上和C#语言中的多态是同一个概念,也基本是类似的实现方式
动态多态
首先我们来看C++中的动态多态,C++中的动态多态和面向对象语言C#中的多态基本上是一致的, 也就是说在基类中有一个虚函数, 然后在各个子类中重写这些虚函数, 来完成在各个子类中不同的实现,从而实现多态。 比如:
namespace TestAnimal { class Animal { public: virtual void Action() const = 0; }; class Bird : public Animal { public: virtual void Action() const //这里可以看到,派生类的的重写函数这里,也加上了virtual关键字, 这是因为继承后基类的虚函数被继承下来了,在派生类中依旧保持虚函数属性 =》 这和C#中显然很不一样 { std::cout << "bird is flying\n"; } } class Dog : public Animal { public: virtual void Action() const { std::cout << "dog is running\n"; } } class Rabbit : public Animal { public: virtual void Action() const { std::cout << "rabbit is walking\n"; } } void DoAction(const Animal *aml) { aml->Action(); } }
由上面可以看到,动态多态本质上就是面向对象设计中的继承,多态的概念.
我在一篇文章中看到,说上面这种虚函数的重写要求三同 => 返回值类型相同,函数名相同,参数列表相同; 但是有一个例外=> 协变,也就是说子类重写基类虚函数时,与基类虚函数的返回值类型可以不同,但是返回值类型必须满足父子关系
class ReturnType {}; class SubReturnType : public ReturnType {}; class Person { public: virtual ReturnType* Eat() { return new ReturnType; } } Class Student : public Person{ public: virtual SubReturnType* Eat() { return new SubReturnType; //这里SubReturnType是ReturnType的子类型 }
}
静态多态
接下来我们再来看看静态多态,