2015-04-04 57 views
-1

我無法理解如何讓子類使用父類中的受保護成員。使用受保護的成員

假設在父類中,我有一個公共函數,它將data_parent設置爲受保護成員,等於某個值。

現在,在子類中,我有一個名爲data_child的受保護成員,並且有一個公共函數,它將返回data_parent + data_child。

但是,當我嘗試編譯時,收到錯誤「使用未聲明的標識符'data_parent'」。我究竟做錯了什麼?

+4

顯示效果會更好 – 2015-04-04 23:29:40

+0

實際代碼請張貼[MCVE(http://www.stackoverflow.com/help/mcve)。錯誤提示沒有這樣的變量'data_parent' ... – Barry 2015-04-04 23:29:44

+0

請提供您嘗試運行的代碼。沒有代碼,我們無法理解你的意思。 – 2015-04-04 23:55:08

回答

3

我無法解釋您的錯誤消息,只是您的代碼與您的描述有所不同。

以下基本上是你所描述的,除了我添加了構造函數(這是可選的),選擇了成員函數的名字,並添加了一個驅動程序來測試。它工作沒有錯誤。

#include <iostream> 

class Parent 
{ 
    public: 
     Parent() : data_parent(0) {}; 
     void SetDataParent(int x) {data_parent = x;}; 
    protected: 
     int data_parent; 
}; 

class Child: public Parent 
{ 
    public: 
     Child() : Parent(), data_child(0) {}; 
     void SetDataChild(int x) {data_child = x;}; 
     int GetSum() const {return data_child + data_parent;}; 
    protected: 
     int data_child; 
}; 

int main() 
{ 
    Child child; 
    child.SetDataParent(42); 
    child.SetDataChild(100); 
    std::cout << child.GetSum() << '\n'; 
} 

我的猜測是,你忘了有Child繼承Parent,使得在相當緊張的家庭關係。

+1

這個答案對這個星球上的每個被收養的孩子都是非常冒犯的。 – 2015-04-05 00:50:38

0

解決了這個問題。我沒有意識到從普通類和模板類繼承之間是有區別的。我需要包括

using Parent<type>::data_parent;

+0

或寫'this-> data_parent'。 – 2015-04-05 00:51:04

+0

這是你遺漏的一個關鍵信息......基類是模板專業化。 – Peter 2015-04-05 07:12:34