繁体   English   中英

从模板重载基础 class 虚拟 function 派生 class

[英]Overload Base class virtual function from template Derived class

我想要从指针表中访问几个数据。 数据可以是任何类型(例如:int、double、string)。 我创建了一个 Base class 来使用指针,我想派生一个模板 class 来进行打字。

我收到以下消息,但我不知道出了什么问题(即使我有一种强烈的感觉,我误解了很多......):

错误:“virtual double Base::get_value()”不能用“virtual int Base::get_value()”重载

class Base
{
    public :        
        virtual int get_value() = 0;
        virtual double get_value() = 0;
};

template <typename T>
class Derived : public Base
{
    private :
        T m_value;
        
    public :
        Derived(T val):Base(), m_value(val) {}
    
        virtual T get_value() { return m_value; }
};

您不能仅根据返回类型重载 function。 因此这是行不通的:

class Base
{
    public :        
        virtual int get_value() = 0;
        virtual double get_value() = 0;
};

如果您调用b->get_value() ,则无法消除两者的歧义。

接下来在Derived中,您可能希望从基中覆盖方法,为此使用关键字override使您的意图清晰并获得更好的编译器错误::

virtual T get_value() override { return m_value; }

但是,由于Base中的问题,这也不起作用。 你需要重新考虑你的设计。 派生的 class 必须实现Base所有抽象方法才能成为非抽象 class。 您无法选择实施哪一个。

看起来您正在尝试重新实现类似于std::anystd::variant的东西。 从头开始实施这两者都不是一件容易的事。 如果您关心自己的实现,那么我建议您看看它们是如何实现的。 如果没有,请使用它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM