我有Packet类包含虚方法,我有LogInRequest类,它扩展了包类
Packet.h文件
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(){
}
我正在尝试从像
这样的工厂创建这个LogInRequestPacketPacket *packet = m_packetFactory->createInstance(static_cast<PACKET_TYPES>(type));
packet->fromByte(pdata);
似乎试图调用受保护的虚拟fromByte函数而不是子类的fromByte函数。
我在Packet.h文件中的Packet类范围内声明“虚拟空白来自于此(char * d)= 0”的行处获得一条红线,并且它抱怨“......受保护”
此外,它也在上下文中对x抱怨
packet->fromByte(pdata);
如何解决此问题。提前谢谢......
答案 0 :(得分:2)
调用函数访问说明符总是在编译时从调用对象/指针/引用中推导出来。
如果base class
(在您的情况下)正在调用该函数,那么编译器将考虑其访问说明符,即protected
,因此会出现错误。
假设您在基类中创建该方法访问说明符public
并在派生类中生成protected
并运行相同的代码。它可以正常工作(这与C ++中的Java access speicifier不同)。
答案 1 :(得分:2)
当您尝试通过指针或引用调用方法时,编译器将验证该对象的 static 类型中函数的访问说明符,即使它将调用该调用动态类型。
在你的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 :(得分:0)
packet
被声明为Packet*
。由于在Packet
中它不公开 - 你不能这样做。
一般来说,我认为在继承时更改接口函数的访问权限并不是一个好主意。如果一个函数被隐藏 - 可能是有原因的。如果没有 - 在父对象上更改。