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的子类型
       }
}

 

 

 

静态多态

接下来我们再来看看静态多态,

 

posted on 2023-03-07 15:48  新西兰程序员  阅读(86)  评论(0编辑  收藏  举报