【问题标题】:Way around impossibility to overload parameterless functions绕过不可能重载无参数函数的方法
【发布时间】:2015-03-23 14:50:28
【问题描述】:

我有一个关于在从同一个基类继承2个不同类的上下文中重载虚函数的问题,它们都需要相同的函数,但是对于不同的数据类型+函数没有参数,所以显然不能重载。

例子:

class Base {

    virtual int get_member(){};
    virtual char get_member(){};

};

class Derived1: public Base {

    int get_member(){return member;}

    private:

        int member = 0;

};

class Derived2: public Base {

    char get_member(){return member;}

    private:

        char member = 'a';
}

这不编译,我有点明白为什么,但不是真的。但我的实际问题是一个概念性问题,即如何处理这样的问题而不是,因为重载不起作用。

【问题讨论】:

  • 你可以随时使用 getIntMember, getStringMember;
  • 您必须给它们起不同的名称,或者可能将其设为模板。但是,模板 + 虚拟是棘手的。
  • 嗯,好的,谢谢。原以为会有一个优雅的解决方案。
  • 你已经表明你知道你不能通过返回类型重载,这是正确的。但是您没有问我们您的真正问题(为什么您认为您需要重载返回类型)所以我们可以帮助解决您真正的问题。
  • 嗯,是的,因为这个例子很接近我的真正问题。我有两个继承类,每个类都有一个成员,每个成员的类型不同。该示例只是我真实代码的简化版本,可以这么说。

标签: c++ inheritance overloading virtual


【解决方案1】:

你可以使用类似Boost.Any:

#include <boost/any.hpp>
class Base {
  public:
    virtual ~Base() {}
    boost::any getValue() { return m_value; }
  private:
    boost::any m_value;  
};

// for derived classes, you really do not need a new getValue()

【讨论】:

  • 嗯,我需要坚持最基本的库......所以不能使用它:/我尝试了模板解决方案,但没有让它起作用。我想我会采用最简单但有点丑陋的解决方案,即为每种数据类型声明一个单独的函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多