【问题标题】:Template class extending from non-template base class and overriding function parameters从非模板基类扩展的模板类和覆盖函数参数
【发布时间】:2018-11-08 15:01:17
【问题描述】:

我正在尝试为 PacketDecoder 创建一个非模板基类,以便可以将 Base* 存储在 std::map 中。解码功能被正确覆盖。编码函数给了我这个错误“'编码'不是虚拟的,不能被声明为纯的”。我可能会认为这个问题来自 Java 背景是错误的。有没有更惯用的 c++ 方法来解决这个问题?

class Base {
public:
    virtual Packet* decode(folly::io::Cursor& cursor) = 0;
    virtual void encode(Packet* packet) = 0;
};

template<typename T, typename std::enable_if<std::is_base_of<Packet, T>::value>::type* = nullptr>
class PacketDecoder : public Base {
public:
    virtual T* decode(folly::io::Cursor& cursor) = 0;
    virtual void encode(T *packet) = 0;
};

示例用法:

class TestDecoder : public PacketDecoder<ProxyJoinPacket> {
public:
    ProxyJoinPacket *decode(folly::io::Cursor &cursor) override {
        uint32_t stringLength;
        if (!cursor.tryReadBE<uint32_t>(stringLength)) {
            throw std::runtime_error("Failed to read string length");
        }

        if (cursor.length() < stringLength) {
            throw std::runtime_error("Too few bytes for string");
        }

        auto uuid = cursor.readFixedString(stringLength);
        return new ProxyJoinPacket(uuid);
    }

    void encode(ProxyJoinPacket *packet) override {

    }


};

std::vector<Base*> decoders;
void a() {
    decoders.insert(new TestDecoder()); // error "Allocating an object of abstract class type 'TestDecoder'"
}

【问题讨论】:

  • 提示:使用override 关键字确保派生实际上覆盖了基类方法
  • 我也尝试过使用覆盖,它导致了同样的错误。
  • 请提供minimal reproducible example。你在哪里实例化PacketDecoder
  • 只有返回类型,否则是新函数
  • 我的代码中没有那个错字。我在 SO 编辑器中编辑时不小心添加了它。

标签: c++ c++17


【解决方案1】:

问题是你原来的类有这个虚函数:

virtual void encode(Packet* packet) = 0;

那么你继承的类有这个:

virtual void encode(T *packet) = 0;

这是两个不同的虚函数。

所以当你这样做时:

void encode(ProxyJoinPacket *packet) override {

你只覆盖了他继承的类中的方法,而不是Base中的方法,仍然缺失。

所以改变你继承的类以使用Packet

virtual void encode(Packet* packet) = 0;

您还可以更改继承的类并添加以下内容:

void encode(Packet* packet) final {
    encode(dynamic_cast<T*> packet);
}

不要忘记虚拟析构函数...

【讨论】:

    猜你喜欢
    • 2014-08-16
    • 2017-06-28
    • 2021-12-28
    • 2021-11-08
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    相关资源
    最近更新 更多