C++多态的学习总结

来源:互联网 发布:uc独角兽 知乎 编辑:程序博客网 时间:2024/06/16 23:01

 多态的总结:

1 .多态的含义就是动态绑定,对于同样的函数名在编译时无法确定调用调用哪个函数,就是说在编译的时候无法将函数名与函数地址绑定,只有在运行的才能确定调用的函数版本,才能将函数名与具体的函数地址绑定。

2 . 多态的具体实现就是虚函数的实现:即用一个指向子类对象的父类引用(父类指针),在函数调用时可以调用到正确版本的函数。表现形式有以下几种。

  •  用一个父类指针指向一个子类对象,如果在父类中被覆盖的函数被声明为virtual的话,就可以用这个指向子类对象的父类指针(引用)来调用到子类版本的重新定义的虚函数。
  • 在一个普通函数内用父类引用(指针)作为形参,这样就可以用这个指针接收到任何它的子类对象包括它自己。(这样就可以在函数体内用父类指针调用被父类中被覆盖的函数(声明为virtual的函数),会根据传入对象的不同而调用不同版本的覆盖函数。从而实现以同样的代码来实现不同的操作)。
  • 在复合类(组合类)中,尽量引用高层次的类(别的父类指针)当做类的成员变量,这样就可以通过它创建出它所对应的任何子类包括它自己。
  • 在容器(集合)中,可以声明一个父类指针的容器,这时可以往容器中添加它所对应的任何子类包括它自己。
实例验证一 代码如下:

#include <iostream>using namespace std;class Base{    private :    int i=100;    public :    virtual void   print(){        cout<<"In parent Base menber i= "<<i<<endl;    }};class Derived1:public Base{    private :    int a=1;    public :    virtual void print(){        cout<<"In son Derived1 a= "<<a<<endl;    }};class Derived2:public Base{    private :    int b=2;    public :    virtual void print(){        cout<<"In son Derived2 b= "<<b<<endl;    }};void  Interface(Base &b)//或void  Interface(Base *b),实参改为“&子类或父类的对象地址{    b.print();/*动态绑定,在编译时不能确定print()函数的绑定地址,只有在运行时才能确定函数版本。从而实现多态*/    /*利用虚函数实现多态,以同样的函数,同样的代码可以执行不同的操作*/}int main(int argc, const char * argv[]){    Derived1 d1;    Derived2 d2;    Base &b1=d1;    b1.print();    Base &b2=d2;    b2.print();    Base *b;  /*虚函数实现多态的第一种方式:以指向子类对象的父类指针(父类引用)来调用子类重写父类的成员函数*/    b=&d1;    b->print();    b=&d2;    b->print();    cout<<"==============================="<<endl;    Interface(d1); /*多态的第二种方式:以父类指针(引用)为形参,以子类或父类对象为实参用传地址(引用)的方式为函数提供                    0.不同版本虚函数的实现*/    Interface(d2);    return 0;}
运行结果如下:



实例验证二  代码如下:

#include <iostream>using namespace std;class Base{    public :    virtual void print(){ cout<<"parent Base print()"<<endl; }};class Derived1:public Base{    public :    void print(){ cout<<"Derived1 print()"<<endl; }};class  Derived2:public Base{    public :    void print(){ cout<<"Derived2 print()"<<endl; }};class  Derived3:public Base{    public :    void print(){ cout<<"Derived3 print()"<<endl; }};class Complex{    private :    Base *b;    public :    Complex(Base *b1){  b=b1;}    void display(){        b->print();    }};int main(int argc, const char * argv[]){    Derived1 d1;    Derived2 d2;    Derived3 d3;    Base b;    Complex c(&b);/*多态实现的第三种方式:在复合类中,声明高层次类(父类)的指针作为成员,                   就可以调用所有的父类以及继承的子类对象了*/    c.display();    Complex c1(&d1);    c1.display();    Complex c2(&d2);    c2.display();    Complex c3(&d3);    c2.display();    return 0;}

运行结果如下:


0 0
原创粉丝点击