2015-12-13 33 views
-3

我跑http://en.cppreference.com/w/cpp/language/virtual '詳細' 下的第一個實施例來證明的想法基類中的虛函數是否可見?

Base::vf does not need to be visible (can be declared private, or inherited using private inheritance) to be overridden.

class B { 
    virtual void do_f(); // private member 
public: 
    void f() { do_f(); }; // public interface 
}; 
struct D : public B { 
    void do_f() override; // overrides B::f 
}; 

int main() 
{ 
    D d; 
    B* bp = &d; 
    bp->f(); // calls D::do_f(); 
} 

但是編譯器報告錯誤:http://cpp.sh/5hk6v

/tmp/ccNhIT1Y.o: In function `main': 
:(.text.startup+0xb): undefined reference to `vtable for D' 
:(.text.startup+0x10): undefined reference to `D::do_f()' 
collect2: error: ld returned 1 exit status 

(我所選擇C++ 14)

索賠是錯誤的還是代碼中存在錯誤?

+1

將必要的代碼放入問題中,而不是鏈接中。 –

+1

** - 1 **未提供代碼和編譯器調用。無論如何,這種說法是正確的,問題出現在代碼中,或者是編譯器中,或者是你的解釋,或者是這種混合。 –

+0

私人會員仍然可見,所以引用很具誤導性。 –

回答

2

您發佈的鏈接更多的是一個概念的例子,而不是完整的現成構建代碼。

您聲明D::do_f但無處定義它。至少添加一個空的主體,它會生成沒有錯誤。 (如@彼得的評論所述,列出的錯誤實際上來自鏈接器,而不是編譯器。)

struct D : public B { 
    void do_f() override {} // overrides B::f 
}; 
+1

錯誤實際上來自鏈接器,而不是來自編譯。 – Peter

+0

@Peter這是正確的,相應編輯。 – dxiv

+0

哎呀,我沒有仔細看代碼。 – city

相關問題