C++ 在繼承中虛函數、純虛函數、普通函數,三者的區別

1.虛函數(impure virtual)ios

  C++的虛函數主要做用是「運行時多態」,父類中提供虛函數的實現,爲子類提供默認的函數實現函數

  子類能夠重寫父類的虛函數實現子類的特殊化。spa

  以下就是一個父類中的虛函數:指針

class A
{
public:
    virtual void out2(string s)
    {
        cout<<"A(out2):"<<s<<endl;
    }
};

2.純虛函數(pure virtual)code

  C++中包含純虛函數的類,被稱爲是「抽象類」。抽象類不能使用new出對象,只有實現了這個純虛函數的子類才能new出對象。對象

  C++中的純虛函數更像是「只提供申明,沒有實現」,是對子類的約束,是「接口繼承」。blog

  C++中的純虛函數也是一種「運行時多態」。繼承

  以下面的類包含純虛函數,就是「抽象類」:接口

class A
{
public:
    virtual void out1(string s)=0;
    virtual void out2(string s)
    {
        cout<<"A(out2):"<<s<<endl;
    }
};

3.普通函數(no-virtual)string

  普通函數是靜態編譯的,沒有運行時多態,只會根據指針或引用的「字面值」類對象,調用本身的普通函數

  普通函數是父類爲子類提供的「強制實現」。

  所以,在繼承關係中,子類不該該重寫父類的普通函數,由於函數的調用至於類對象的字面值有關。

4.程序綜合實例

#include <iostream>
using namespace std;

class A
{
public:
    virtual void out1()=0;  ///由子類實現
    virtual ~A(){};
    virtual void out2() ///默認實現
    {
        cout<<"A(out2)"<<endl;
    }
    void out3() ///強制實現
    {
        cout<<"A(out3)"<<endl;
    }
};

class B:public A
{
public:
    virtual ~B(){};
    void out1()
    {
        cout<<"B(out1)"<<endl;
    }
    void out2()
    {
        cout<<"B(out2)"<<endl;
    }
    void out3()
    {
        cout<<"B(out3)"<<endl;
    }
};

int main()
{
    A *ab=new B;
    ab->out1();
    ab->out2();
    ab->out3();
    cout<<"************************"<<endl;
    B *bb=new B;
    bb->out1();
    bb->out2();
    bb->out3();

    delete ab;
    delete bb;
    return 0;
}

執行結果:

相關文章
相關標籤/搜索