簡體   English   中英

使用在C ++類之外定義的純虛函數?

[英]use of pure virtual function defined outside the class in C++?

我在互聯網上讀到,即使在以下類中將其定義為純虛函數,也很少會定義該函數。

class abc
{
    public:
        virtual void func() = 0;
}

void abc::func()
{
    cout << "in abc::func()";
}

我不明白這個用法。 在鏈接http://www.gotw.ca/gotw/031.htm上 ,提到我們可以將其用作純虛擬析構函數。 但是我還不清楚。 誰能讓我知道有什么用。

即使析構函數是純虛擬的,它也需要一個實現,因為析構函數是自動和非虛擬調用的(在每個基類鏈中)。

因此,如果您有一個純虛擬析構函數,則最好也定義它。

否則,您將無法銷毀該類或派生自該類的類的任何對象:將在銷毀中嘗試使用析構函數調用,並且鏈接器會抱怨找不到其定義。

由於語法上的一個古怪的問題,因此無法在類定義中內聯提供該定義,而必須單獨提供。

已實現的純虛函數的另一種用法是強制子類顯式要求默認行為。 有效的C ++項目34(解釋(解釋)?)給出了一個很好的例子:

class Airplane
{
public:
    virtual void fly() = 0;
};

Airplane::fly()
{
    //A default implementation
}

class ModelA : public Airplane
{
public:
    virtual void fly() { Airplane::fly(); } //explicitly use the default
};

class ModelB : public Airplane
{
public:
    virtual void fly() { Airplane::fly(); } //explicitly use the default
};

class ModelC : public Airplane
{
public:
    virtual void fly() { //different implementation }
};

這樣做的目的是使客戶端很難意外繼承他們在考慮時可能不想要的默認行為。 用更籠統的術語來說,這種習慣用法通過排除本質上不是默認值的虛擬方法的實現,可以避免代碼重復。

沒有規則可以阻止您定義純虛方法。 這可以用於強制子類提供實現,但同時也使您有機會提供方便的實現(執行常見任務)。

例如,如果xyz源自abc則可以abc使用abc的函數定義:

struct xyz : public abc
{
    virtual void func() override
    {
        abc::func(); // explicitely calling the implementation provided by abc
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM