簡體   English   中英

C ++多重繼承和純函數

[英]C++ multiple inheritance and pure functions

我對“多重繼承問題”有些困惑。 考慮下面的大量代碼:

#include <iostream>

struct iface
{
    virtual void foo () = 0;
    virtual ~iface () {}
};

struct wrapped
{
    virtual void foo ()
    {
        std::cerr << "wrapped\n";
    }
};

struct impl : public wrapped, public iface
{
};

iface* factory ()
{
    return new impl;
}

int main ()
{
    iface *object = factory ();

    object->foo();

    delete object;

    return 0;
}

這是從使用pimpl習慣用法的一些代碼中抽象出來的。 這個想法是, wrapped是一個復雜的類,帶有各種各樣的其他特征。 iface只是讓特定小面wrapped可見和factory()函數構建一個impl實現類iface通過使用wrapped 在我的真實代碼中, wrapped類來自具有大量頭文件樹的庫,因此我在單獨的編譯單元中定義了impl ,以避免我的應用程序的其余部分不得不將它們引入。

無論如何,我粘貼的內容無法編譯,並出現以下錯誤:

$ g++ -o test test.cc
test.cc: In function ‘iface* factory()’:
test.cc:23:16: error: cannot allocate an object of abstract type ‘impl’
     return new impl;
                ^
test.cc:17:8: note:   because the following virtual functions are pure within ‘impl’:
 struct impl : public wrapped, public iface
        ^
test.cc:5:18: note:     virtual void iface::foo()
     virtual void foo () = 0;
                  ^

顯然,我可以通過在impl中編寫具體的foo實現來避免錯誤,該實現轉發給wrapped::foo() ,但是我不明白為什么編譯器不從wrapped類中提取實現。

我假設在進行impl名稱解析(就是正確的詞)時,以某種方式來自iface的“ foo”和來自wrapped的“ foo”最終會有所不同,但是我真的不明白為什么。

有人可以解釋發生了什么嗎?

如果類的任何虛函數是純虛函數,則該類是抽象的。 類impl有兩個同名的成員函數

iface::foo

wrapped::foo

impl類的第一個成員函數是純虛函數,因此該類是抽象的。 編譯器可能不會創建抽象類的對象。

impl有兩個完全獨立的方法,即iface::foowrapped::foo 沒有名稱解析-虛擬函數調用由稱為vtable的結構調度,該結構包含指向實現的指針。 至少在沒有虛擬繼承的情況下,一個類為其每個直接祖先都有單獨的vtable。 來自不同祖先的同義虛擬函數最終會出現在不同的vtable中。 編譯器無法“組合”它們。 C ++沒有mixin。

顯然,我可以通過在impl中編寫foo的具體實現來避免錯誤,該實現轉發給wrapd :: foo()

更好的是,不要使用雙重繼承-做類似的事情

struct impl : public iface
{
    virtual void foo ()
    {
        wr.foo ();
    }
private:
    wrapped wr;
};

暫無
暫無

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

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