多态

作者: artsing | 来源:发表于2018-05-14 17:41 被阅读0次

virtual 关键字定义虚函数
多态是通过指向虚函数表的虚指针实现的。

虚指针和虚表
D d;
d.f2();      // 注意实际调用 B::f2(); 而B::f2() 中调用了 f1(); 是通过虚指针调用的 (VPTR[0])(); 是调用了D::f1();
d.B::f1();   // 明确指定调用 B::f1(); 没有通过虚指针
d.f1();      // 通过虚指针和虚表调用 D::f1();
d.D::f1();   //调用D::f1();

例子

#include <stdio.h>
class CParent 
{ 
public: 
    void Intro() { 
        printf("I'm a Parent, "); 
        Hobby(); 
    }   
    virtual void Hobby() { 
        printf("I like football!");
    }   
}; 

class CChild : public CParent { 
public:
    void Intro() { 
        printf("I'm a Child, "); 
        Hobby(); 
    }   
    void Hobby() { 
        printf("I like basketball!\n"); 
    }   
}; 

int main(int agc, char *arv[]) { 
        CChild *pChild = new CChild();
        CParent *pParent = (CParent*)pChild; 
        pParent->Intro(); 
        return 0;  
}
#include <stdio.h>  
#include <iostream>  
using namespace std;  
  
class A  
{  
protected:  
    int m_data;  
public:  
    A(int data = 0)  
    {  
        m_data = data;  
    }  
    int GetData()  
    {  
        return doGetData();  
    }  
    virtual int doGetData()  
    {  
        return m_data;  
    }  
};  
  
class B: public A  
{  
protected : int m_data;  
public:   
    B(int data = 1)  
    {  
        m_data  =  data;  
    }  
    int doGetData()  
    {  
        return m_data;  
    }  
  
};  
  
class C : public B  
{  
protected :  int m_data;  
public :  
    C(int data = 2)  
    {  
        m_data = data;  
    }  
};  
int main()  
{  
    C c(10);  
    cout<<c.GetData() << endl;  
    cout<<c.A::GetData()<<endl;  
    cout<<c.B::GetData()<<endl;  
    cout<<c.C::GetData()<<endl;  
  
    cout<<c.doGetData()<<endl;  
    cout<<c.A::doGetData()<<endl;  
    cout<<c.B::doGetData()<<endl;  
    cout<<c.C::doGetData()<<endl;  
      
    return 0;  
}
/*            
结果: 1   1   1   1  1  0  1  1 
*/

相关文章

  • 1.9 多态基本概念

    本小节知识点: 【了解】什么是多态? 【掌握】多态的条件 【了解】多态的优点 1.什么是多态? 什么是多态:多态就...

  • C++ 的多态(Polymorphism), virtual f

    多态 c++支持两种多态,编译时多态和运行时多态但其实编译时多态根本不是真正的多态,编译时多态就是函数的重载,ov...

  • 详解Java多态

    详解Java多态 多态定义 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态...

  • 多态

    1.多态 1.多态 1.1 要点 多态是方法的多态,不是属性的多态 多态的存在有三个必要条件:继承;方法重写;父类...

  • java多态面试题

    java多态性 多态分两种: (1) 编译时多态(设计时多态):方法重载。 (2) 运行时多态:JAVA运...

  • Java_basic_10: 多态polymorphism

    多态polymorphism 多态是指对象的多种形态 主要可以分为引用多态和方法多态 继承是多态的实现基础 引用多...

  • 六、多态与虚函数

    多态的基本概念 多态 多态分为编译时多态和运行时多态。 编译时多态主要是指函数的重载(包括运算符的重载)。对重载函...

  • Java基础之面向对象

    1.多态,继承,封装 Java实现多态有哪些必要条件?具体怎么实现?多态的实现原理?多态的作用? 答:多态的优点 ...

  • java多态面试题

    java多态性 多态分两种: (1) 编译时多态(设计时多态):方法重载。 (2) 运行时多态:JAVA运行时...

  • 多态与虚函数

    多态的基本概念 实现了多态机制的程序,可以使用同一个名字完成不同的功能。 多态分为编译时多态和运行时多态。 多态 ...

网友评论

      本文标题:多态

      本文链接:https://www.haomeiwen.com/subject/mfvxdxtx.html