1. 程式人生 > >C++ 在繼承中虛擬函式、純虛擬函式、普通函式,三者的區別【轉載】

C++ 在繼承中虛擬函式、純虛擬函式、普通函式,三者的區別【轉載】

1.虛擬函式(impure virtual)

  C++的虛擬函式主要作用是“執行時多型”,父類中提供虛擬函式的實現,為子類提供預設的函式實現

  子類可以重寫父類的虛擬函式實現子類的特殊化。

  如下就是一個父類中的虛擬函式:

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

2.純虛擬函式(pure virtual)

  C++中包含純虛擬函式的類,被稱為是“抽象類”。抽象類不能使用new出物件,只有實現了這個純虛擬函式的子類才能new出物件。

  C++中的純虛擬函式更像是“只提供申明,沒有實現”,是對子類的約束,是“介面繼承”。

  C++中的純虛擬函式也是一種“執行時多型”。

  如下面的類包含純虛擬函式,就是“抽象類”:

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

3.普通函式(no-virtual)

普通函式是靜態編譯的,沒有執行時多型,只會根據指標或引用的“字面值”類物件,呼叫自己的普通函式

  普通函式是父類為子類提供的“強制實現”。

  因此,在繼承關係中,子類不應該重寫父類的普通函式,因為函式的呼叫至於類物件的字面值有關。

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;
}

執行結果: