gpt4 book ai didi

c++ - 确保派生类至少实现抽象类 (C++) 的两种方法之一

转载 作者:行者123 更新时间:2023-11-30 03:15:39 25 4
gpt4 key购买 nike

如何确保我的派生类至少实现基类中两个选定方法中的一个?

    class base {
public:

virtual int sample()=0;
virtual Eigen::VectorXf sample()=0;
};

class Derived : Base {
int sample() override {return 1;}

}

此代码返回错误,因为示例方法未使用 VectorXf 返回类型实现。但是,我的意图是只需要实现其中一个。它们在基类中分开的唯一原因是它们具有不同的返回类型。我如何在 C++ 中执行此操作?

最佳答案

按返回类型重载是不可能的。您可以改用 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,那么还有很多选择。

  1. 实现并使用诸如 variant 之类的东西:一个具有在两种事件类型之间进行选择的枚举器的类,以及一个包含这些类型的 union 。
  2. 使用Boost variant .
  3. 标准::对
  4. 实现类的层次结构(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;
    };

问题是,您为什么需要这个?

关于c++ - 确保派生类至少实现抽象类 (C++) 的两种方法之一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56864505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com