Убедиться, что производный класс реализует хотя бы один из двух методов из абстрактного класса (C ++) - PullRequest
1 голос
/ 03 июля 2019

Как мне убедиться, что мой производный класс реализует хотя бы один из двух выбранных методов в базовом классе?

    class base {
     public:

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

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

    }

Этот код возвращает ошибку, так как пример метода не реализован с типом возврата VectorXf. Однако я намерен реализовать только один из них. Единственная причина, по которой они являются отдельными в базовом классе, заключается в том, что они имеют другой тип возвращаемого значения. Как я могу сделать это в C ++?

1 Ответ

2 голосов
/ 03 июля 2019

Перегрузка по типу возврата невозможна.Вместо этого вы можете использовать std :: Вариант:

#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. Реализуйте и используйте что-то вроде варианта:класс, который имеет перечислитель, выбирающий между двумя активными типами, и объединение, содержащее эти типы.
  2. Использование Вариант повышения .
  3. std :: pair
  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;
    };
    

Вопрос в том, почемуты нуждаешься в этом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...