聊聊C++的多态

什么是多态
如果有几个上似而不完全相同的对象,有时人们要求在向它们发出同一个消息 时, 它们的反应各不相同,分别执行不同的操作。这种情况就是多态现象。

例如:武大女神,北大女神,人大女神,她们都有相同属性和行为,她们正分别和男友一起在清华大学的小树林学习.突然她们的男友同时叫:老婆,你快过来..她们会分别走到不同的男友面前.而不是你…

  C++中所谓的多态(polymorphism)是指,由继承而产生的相关的不同的类,其对象 对同一消息会作出不同的响应。 
  多态性是面向对象程序设计的一个重要特征,能增加程序的灵活性。可以减轻 系统 升级,维护,调试的工作量和复杂度. 

赋值兼容(多态实现的前提)
赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的 对象来替代。赋值兼容是一种默认行为,不需要任何的显示的转化步骤。   

赋值兼容规则中所指的替代包括以下的情况:

 ︎1.派生类的对象可以赋值给基类对象.
2.派生类的对象可以初始化基类的引用。
3.派生类对象的地址可以赋给指向基类的指针。 

在替代之后,派生类对象就可以作为基类的对象使用,但只能使用从基类继承的成员。 

#include <iostream> 
 using namespace std;   
  class Parent  
   {    
   public:  
    Parent(int a)
    {   
    this-­‐>a =  a; 
    cout<<"Parent a"<<a<<endl;
    }   
  void  print() 
  //⼦子类的和⽗父类的函数名字⼀一样 
  { 
  cout<<"Parent 打印 a:"<<a<<endl; 
  } 
    private:    
    int a;  
   };   

class Child:publicParent    
   {    
   public:
   Child(int b) :Parent(10)     
  { 
    this-­‐>b=b;    
    cout<<"Child b"<<b<<endl;   
  } 

  void print()      
  { 
  cout<<"Child打印 b:"<<b<<endl;  
  } 
  private:  
  int b;    
   };   

void    
  howToPrint(Parent 
  *base)    
   {
  base-­‐>print();  
  //⼀一种调⽤用语句 
  有多种表现形态...    
   }    

void howToPrint2(Parent &base)  
 {
      base.print(); 
 }  

int main(void)  
{
  Parent*base=NULL; 
  Parent p1(20);
  Child c1(30);
  base =&p1;
  base-­‐>print();  
  //执⾏行⽗父类的打印函数 
  base= &c1;
  /* 编译器认为最安全的做法是编译到⽗父类的print函数, 因为⽗父类和⼦子类肯定都有相同的print函数。 */
  base-­‐>print();  
  //执⾏行谁的函数 ? 
  //貌似我们希望之星Child的print函数
  Parent &base2=    p1;
  base2.print();
  //执⾏行⽗父类的打印函数 
  Parent &base3 =   c1; 
  base3.print();
  //执⾏行谁的函数?
  //函数调用
  howToPrint(&p1);
  howToPrint(&c1);  
  howToPrint2(p1);  
  howToPrint2(c1);  
  return 0; 
   }    

你可能感兴趣的:(C++语言)