您当前的位置: 首页 >  c++

小林coding

暂无认证

  • 1浏览

    0关注

    167博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

C++ 一篇搞懂多态的实现原理

小林coding 发布时间:2020-02-01 17:24:46 ,浏览量:1

虚函数和多态 01 虚函数
  • 在类的定义中,前面有 virtual 关键字的成员函数称为虚函数;
  • virtual 关键字只用在类定义里的函数声明中,写函数体时不用。
class Base 
{
    virtual int Fun() ; // 虚函数
};

int Base::Fun() // virtual 字段不用在函数体时定义
{ }
02 多态的表现形式一
  • 「派生类的指针」可以赋给「基类指针」;
  • 通过基类指针调用基类和派生类中的同名「虚函数」时:
    1. 若该指针指向一个基类的对象,那么被调用是 基类的虚函数;
    2. 若该指针指向一个派生类的对象,那么被调用 的是派生类的虚函数。

这种机制就叫做“多态”,说白点就是调用哪个虚函数,取决于指针对象指向哪种类型的对象。

// 基类
class CFather 
{
public:
    virtual void Fun() { } // 虚函数
};

// 派生类
class CSon : public CFather 
{ 
public :
    virtual void Fun() { }
};

int main() 
{
    CSon son;
    CFather *p = &son;
    p->Fun(); //调用哪个虚函数取决于 p 指向哪种类型的对象
    return 0;
}

上例子中的 p 指针对象指向的是 CSon 类对象,所以 p->Fun() 调用的是 CSon 类里的 Fun 成员函数。

03 多态的表现形式二
  • 派生类的对象可以赋给基类「引用」
  • 通过基类引用调用基类和派生类中的同名「虚函数」时:
    1. 若该引用引用的是一个基类的对象,那么被调 用是基类的虚函数;
    2. 若该引用引用的是一个派生类的对象,那么被 调用的是派生类的虚函数。

这种机制也叫做“多态”,说白点就是调用哪个虚函数,取决于引用的对象是哪种类型的对象。

// 基类
class CFather 
{
public:
    virtual void Fun() { } // 虚函数
};

// 派生类
class CSon : public CFather 
{ 
public :
    virtual void Fun() { }
};

int main() 
{
    CSon son;
    CFather &r = son;
    r.Fun(); //调用哪个虚函数取决于 r 引用哪种类型的对象
    return 0;
}
}

上例子中的 r 引用的对象是 CSon 类对象,所以 r.Fun() 调用的是 CSon 类里的 Fun 成员函数。

04 多态的简单示例
class A 
{
public :
    virtual void Print() { cout fun1()输出结果是什么呢?

class Base 
{
public:
    void fun1() 
    { 
        fun2(); 
    }
    
    virtual void fun2()  // 虚函数
    { 
        cout             
关注
打赏
1659932071
查看更多评论
0.0372s