虚拟保护功能错误

时间:2011-06-17 07:05:51

标签: c++

我有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(){

}

我正在尝试从像

这样的工厂创建这个LogInRequestPacket
Packet *packet = m_packetFactory->createInstance(static_cast<PACKET_TYPES>(type));
packet->fromByte(pdata);

似乎试图调用受保护的虚拟fromByte函数而不是子类的fromByte函数。

我在Packet.h文件中的Packet类范围内声明“虚拟空白来自于此(char * d)= 0”的行处获得一条红线,并且它抱怨“......受保护”

此外,它也在上下文中对x抱怨

packet->fromByte(pdata);

如何解决此问题。提前谢谢......

3 个答案:

答案 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中它不公开 - 你不能这样做。

一般来说,我认为在继承时更改接口函数的访问权限并不是一个好主意。如果一个函数被隐藏 - 可能是有原因的。如果没有 - 在父对象上更改。