[英]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::foo
和wrapped::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.