C++ 多态

多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。
C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。

动态多态的意义:

在没有虚函数的情况下,可以用派生类的对象去初始化基类的引用或用派生类的对象去赋值基类的指针,反之却不可以(用派生类构造基类对象,可以用派生类的对象当基类使用)。
好在可以通过声明虚函数实现动态绑定,就能实现这一过程!

虚函数

虚函数 是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。
我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定

多态的实例代码

  1. #include <iostream>
  2. using namespace std;
  3. class MyClass
  4. {
  5. public:
  6. MyClass();
  7. ~MyClass();
  8. //虚函数,可以让基类指针或引用作为类对象,访问派生类的函数
  9. virtual void display() {
  10. cout << "显示1类" << endl;
  11. }
  12. private:
  13. };
  14. MyClass::MyClass()
  15. {
  16. }
  17. MyClass::~MyClass()
  18. {
  19. }
  20. class Myclass2 : virtual public MyClass{
  21. public:
  22. Myclass2(){};
  23. virtual void display() {
  24. cout << "显示2类" << endl;
  25. }
  26. };
  27. class Myclass3 :virtual public MyClass {
  28. public:
  29. Myclass3(){};
  30. virtual void display() {
  31. cout << "显示3类" << endl;
  32. }
  33. };
  34. /*
  35. void display(*MyClass obj) {
  36. obj.display();
  37. }*/
  38. int main()
  39. {
  40. Myclass2 obj2;
  41. Myclass3 obj3;
  42. MyClass* obj = &obj2;
  43. obj->display();
  44. obj = &obj3;
  45. obj->display();
  46. //动态内存
  47. MyClass* myobj = new Myclass3();
  48. myobj->display();
  49. delete myobj;
  50. }

纯虚函数

我们可能想要在基类中定义虚函数,以便在派生类中重新定义该函数更好地适用于对象,但是您在基类中又不能对虚函数给出有意义的实现,这个时候就会用到纯虚函数。
我可以把虚函数赋值为0, 告诉编译器,函数没有主体,上面的虚函数是纯虚函数
类似Java种的接口。

  1. class Shape {
  2. protected:
  3. int width, height;
  4. public:
  5. Shape( int a=0, int b=0)
  6. {
  7. width = a;
  8. height = b;
  9. }
  10. // pure virtual function
  11. virtual int area() = 0;
  12. };