2010-02-10 41 views
1

我正在使用visual studio在本機C++中進行開發。在不同項目(C++)中從派生類訪問受保護的方法會生成鏈接器錯誤


我有一個項目,其中包含基礎設施 - 我想從同一解決方案中的其他項目中派生類的基類。說我有在infrastructres項目基類:

文件base.h:

class Base 
{ 
     public: 
      void Foo(); 
     protected: 
     void Bar(); 
}; 

,並在另一個項目中,從A派生的類,試圖調用方法吧:

文件derived.h:

class Derived : Base 
{ 
    public: 
    void DoSomething(); 
}; 

文件derived.c PP:

void Derived::DoSomething() 
{ 
Bar(); 
} 

文件main.cpp中:

void main() 
{ 
    Derive d; 
    d.Foo(); //OK 
    d.DoSomething(); // Linker error 
} 

生成以下的鏈接器錯誤:

錯誤1個錯誤LNK2001:解析外部符號「公共:虛擬無效__thiscall基地: :Bar(void)「(?Bar @ Base @@ UAEXXZ)main.obj CplusplusTestProject

我在做什麼錯?

+0

是你的項目DLL庫嗎? – mcdave 2010-02-12 06:37:56

+0

這是Shelly了。 不知道如何添加評論以上的答案。 我將繼承改爲public - 仍然無法正常工作。 是的,Bar有一個實現,我只是沒有把它放在問題中。 如果我將Bar的訪問級別更改爲public,則鏈接錯誤消失 - 只有當Bar受到保護時纔會出現鏈接錯誤。 難道是VS連接器不會將保護和私有方法添加到符號表中嗎? – 2010-02-10 09:43:14

回答

1

最簡單的問題是您沒有將其他項目中生成的庫鏈接到您自己的可執行文件中。

+1

但在這種情況下,我也應該爲調用Foo出錯。 只有在調用的方法受到保護時纔會發生。如果我將它改爲公共,一切正常。 – 2010-02-10 08:40:33

+0

我已經跳過那部分......現在接下來的問題是'Bar'是否實際在原始庫中實現? – 2010-02-10 08:47:16

2

確保你的Base :: Bar()方法的某個地方有它的實現。您可以在定義後重新添加捲曲護腕,然後重建項目。

0

您需要定義Bar成員。在類定義中或在單獨的base.cpp文件中添加Bar的定義。

相關問題