2010-10-20 35 views
0
class Base 
{ 
    protected: 
     int data; 
    public: 
     virtual int getData() { return data; } 
     virtual void setData(int value) { data = value; } 
}; 

class Child : protected Base 
{ 
    public: 
    void setData(int value) 
    { 
     Base::setData(value); 
     cout << "Data is set.\n"; 
    } 
}; 

class Worker 
{ 
    private: 
     Child obj; 
    public: 
     void setGlobalData(int val) 
     { 
     obj.setData(val); // This is normal 
     } 

     int getGlobalData() 
     { 
     return obj.getData(); // Line 140, Error 
     } 
}; 

錯誤:與工人類文件的編譯過程中派生類功能

Base.hpp: In member function ‘int Worker::getGlobalData()’: 
Base.hpp:22:19: error: ‘virtual int Base::getData()’ is inaccessible 
Worker.cpp:140:34: error: within this context 
Worker.cpp:140:34: error: ‘Base’ is not an accessible base of ‘Child’ 
+0

如果getData()在基礎中沒有定義,那很可能是問題的根源。 – 2010-10-20 17:57:38

+0

向我們顯示您的真實代碼。 – 2010-10-20 17:57:57

+0

我修復了一個'虛擬'聲明,但我與GMan - 如果這是你的代碼,你缺少'Base :: getData()'的定義 – birryree 2010-10-20 17:57:57

回答

1

你真的讓它成爲公共基礎課嗎?

//   vvvvvv important 
class Child : public Base 

否則,它是私有的,你會得到類似的錯誤,你有什麼,即:

「基地」不是「兒童」

+0

對,對不起。有'受保護的'。但是如果我需要隱藏'int data'。我不想公開繼承。 – Ockonal 2010-10-20 18:04:13

+1

@Ockonal我認爲你誤解了子類化時的訪問修飾符。如果'int data'在基類中是私有的,'public','protected'和'private'繼承不會修改它。對於它是其中的成員,它始終是「私人」的。 – birryree 2010-10-20 18:07:22

+0

如果我將int數據設置爲受保護的,那麼仍然存在錯誤(帶有受保護的繼承)。 – Ockonal 2010-10-20 18:09:23

0

class Workerclas Worker

Worker類,obj.setData(val);嘗試訪問Child類的私有成員。

+0

我懷疑他的代碼實際上有。 '虛擬'也被拼寫爲'Base :: setData' – GManNickG 2010-10-20 17:56:28

1

這編譯:

class Base 
{ 
    protected: 
     int data; 
    public: 
     virtual int getData() {return data;} 
     virtual void setData(int value) { data = value; } 
}; 

class Child : public Base 
{ 
    public: 
    void setData(int value) 
    { 
     Base::setData(value); 
     cout << "Data is set.\n"; 
    } 
}; 

class Worker 
{ 
    private: 
     Child obj; 
    public: 
     void setGlobalData(int val) 
     { 
     obj.setData(val); // This is normal 
     } 

     int getGlobalData() 
     { 
     return obj.getData(); 
     } 
}; 
+1

一個問題,你的'Base.getData()'類永遠不會返回一個值。 – 2010-10-20 18:07:47

+0

@精英:哦,謝謝。我一味地複製粘貼和編輯。 – Donotalo 2010-10-20 19:32:34

0

除CLAS - >類和VIRTUA - >虛擬你的代碼是完全正常的。它絕對沒有錯。由於從字面上看,這並不是因爲輸入錯誤而編譯的,我懷疑你的原始代碼有點不同,因爲從Base得到的Child是私有的或者getData是私有的。

0

的接入基站由於目前現有版本的代碼有Child繼承Base通過protected繼承,public函數在Base變爲protectedChild,所以Worker不能通過Child對象訪問它們。

0

Child繼承類Baseprotected,所以成員函數Child::getData()不是的Child客戶公開訪問。

正如其他人在這裏所說的,將Base的繼承改爲public是解決這個問題的一種方法。

class Child: public Base 

另外請注意,您鑄造Child對象類型Base也使得對象的功能Base::getData()公開訪問。

return static_cast<Base *>(&obj)->getData();