2011-06-17 61 views
0

我有包類包含虛方法,我有延伸分組分類虛保護功能錯誤

Packet.h LogInRequest類文件

class Packet { 

public: 
    Packet(); 
    virtual ~Packet(); 

protected: 
    virtual char* toByte() = 0; 
    virtual void fromByte(char *d) = 0; 
    virtual Packet* handle() = 0; 

    short m_bodySize; 
    int64_t m_deviceId; 
}; 


/* 
* LogInRequestPacket 
*/ 
class LogInRequestPacket: public Packet{ 

public: 

    LogInRequestPacket(); 
    virtual ~LogInRequestPacket(); 

    virtual char* toByte(); 
    virtual void fromByte(char *d); 
    virtual Packet* handle(); 
}; 

Packet.cpp文件

#include "Packet.h" 

Packet::Packet() { 
    // TODO Auto-generated constructor stub 

} 

Packet::~Packet() { 
    // TODO Auto-generated destructor stub 
} 

/* 
* LogInRequestPacket 
*/ 
LogInRequestPacket::LogInRequestPacket(){ 
    printf("LogInRequestPacket is being created... \n"); 
} 

LogInRequestPacket::~LogInRequestPacket(){ 

} 

char* LogInRequestPacket::toByte(){ 

} 

void LogInRequestPacket::fromByte(char *d){ 

} 

Packet* LogInRequestPacket::handle(){ 

} 

我試圖從這樣的工廠創建這個LogInRequestPacket

Packet *packet = m_packetFactory->createInstance(static_cast<PACKET_TYPES>(type)); 
packet->fromByte(pdata); 

它似乎試圖調用受保護的虛擬fromByte函數而不是子類的fromByte函數。

我得到的線紅線在Packet.h文件包類範圍聲明「虛擬無效fromByte(字符* d)= 0」,並抱怨「......保護」

而且,它也抱怨與x在範圍內

packet->fromByte(pdata); 

我該如何解決這個問題。在此先感謝...

回答

2

當您嘗試通過指針或引用調用方法時,編譯器將驗證該對象類型的靜態類型函數的訪問說明符,即使它將調用該動態類型。

在您的Packet類中,您聲明不希望用戶代碼(Packet,朋友和派生類除外)能夠調用這些方法,並且編譯器只是告訴您這一點。如果這些功能應該可以從其他代碼訪問,請將它們公開:

class Packet { 
public: 
    Packet(); 
    virtual ~Packet(); 

    virtual char* toByte() = 0; 
    virtual void fromByte(char *d) = 0; 
    virtual Packet* handle() = 0; 
protected: 
    short m_bodySize; 
    int64_t m_deviceId; 
}; 
2

調用函數訪問說明符總是從調用對象/指針/引用在編譯時中推導出來的。

如果基地class(在你的情況下)正在調用該函數,那麼編譯器會考慮它的訪問說明符,這是protected,從而出現錯誤。

假設您在基類中創建該方法訪問說明符public,並在派生類中創建protected並運行相同的代碼。它會正常工作(這與C++中的Java訪問指針不同)。

0

packet被宣佈爲Packet*。由於在Packet它不公開 - 你不能這樣做。

通常,我認爲在繼承時更改接口函數的訪問權限並不是一個好主意。如果一個函數被隱藏 - 可能有一個原因。如果沒有 - 在父對象上進行更改。