簡體   English   中英

C ++繼承,模板和覆蓋

[英]C++ inheritance, templates, and override

我在規范與模板類的接口時遇到了一些麻煩。 為什么會編譯以下內容?

class IFoo {
public:
    virtual void functionA()=0;
};

template<class T>
class Foo : public IFoo{
public:
    void functionA() override { };
    void functionB() override { };
};

functionB在IFoo中顯然不存在,那么為什么編譯器不拋出錯誤? 目前正在GCC 5.4上運行。

關於我如何處理此問題的一些背景知識:我正在為我的一個副項目編寫一些代碼,該代碼在很大程度上取決於常見的線性代數例程。 我想對庫的選擇進行抽象,以例如促進基准測試。 想法是使用類似IFoo的接口來執行此操作,以便業務邏輯代碼僅了解IFoo,而不必適應任何單個線性代數庫的怪癖。 這是可行的,因為僅需要幾個關鍵功能。 我不想為所有可用的操作提供接口。 我需要模板,以允許使用不同精度的處理,例如,浮點數,雙精度數,小浮點數等由同一子類處理。

在我看來,針對此問題的明智設計是使用此接口在單獨的編譯單元中重新包裝對這些庫的訪問,以生成實現此接口的獨立靜態庫或運行時庫。 從一個庫到另一個庫的交換就像鏈接到所需庫一樣簡單。 無需更改代碼。 任何對此總體策略的想法也表示贊賞!

僅當其他一些代碼使用模板時,才會實例化模板。 您的示例沒有該代碼,因此無論是否編譯都沒有關系。 嘗試創建Foo<int>的對象,然后親自查看GCC會抱怨。

您僅定義了一個類模板,但沒有實例化它。 模板參考摘錄:

類模板本身不是類型,對象或任何其他實體。 從僅包含模板定義的源文件中不會生成任何代碼。 為了顯示任何代碼,必須實例化模板:

如果嘗試使用以下方法實例化對象:

int main() {
    std::unique_ptr<IFoo> p = std::make_unique<Foo<void>>();
}

那么GCC會抱怨:

錯誤:“ void Foo :: functionB()[with T = void]”標記為“ override”,但未覆蓋
void functionB()覆蓋{};

關於Coliru的實時示例
雖然以上嘗試在VS上編譯,但您嘗試使用以下方法調用成員函數:

p->functionB();

您將收到以下錯誤:

'functionB':不是'IFoo'的成員
類“ IFoo”沒有成員“ functionB”

話雖如此,目前尚不清楚您實際上在模板中的哪個位置使用模板。 如果刪除了template<class T>您將首先得到您期望的錯誤。

暫無
暫無

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

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