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   新西兰程序员  阅读(96)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2018-03-07 JavaScript中函数作为值
2018-03-07 JavaScript中的真和假,==和===, 不等
2016-03-07 转载 SharePoint Foundation和SharePoint Server的区别
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示