如何确保派生类在基类中实现至少两个选择的方法之一?
class base {
public:
virtual int sample()=0;
virtual Eigen::VectorXf sample()=0;
};
class Derived : Base {
int sample() override {return 1;}
}
此代码返回错误,因为没有使用VectorXf返回类型实现示例方法。但是,我的目的是只执行其中之一。它们在基类中分开的唯一原因是它们具有不同的返回类型。如何在C ++中做到这一点?
答案 0 :(得分:2)
无法按返回类型重载。您可以改用std :: variant:
#include <variant>
class Base {
public:
virtual std::variant<int, Eigen::VectorXf> sample()=0;
};
class Derived : public Base {
std::variant<int, Eigen::VectorXf> sample() override {return 1;}
};
如果只限于C ++ 11,那么有很多选择。
实现类的层次结构(std :: any的简化),并返回指向对象的正确指针:
class AbstractBase {
public:
virtual ~AbstractBase() = 0;
template <class T>
const T* get() const;
};
template <class T>
class ValueWrapper : public AbstractBase {
public:
ValueWrapper(const T& value) : m_value(value) {}
const T & getValue() const { return m_value; }
private:
T m_value;
};
template <class T>
inline const T * AbstractBase::get() const {
auto child = dynamic_cast<ValueWrapper<T> const*>(this);
return child ? &child->getValue() : nullptr;
}
class Base {
public:
virtual std::unique_ptr<AbstractBase> sample()=0;
};
问题是,您为什么需要这个?