Разрешить производному классу реализовывать одну чистую виртуальную функцию из базового абстрактного класса - PullRequest
1 голос
/ 28 августа 2011

Возможно ли иметь абстрактный базовый класс с рядом чисто виртуальных функций:

template <typename T, typename U = NullType, typename V = NullType>
class Functor { 
public:
    virtual ~Functor() {}

    virtual T operator()() = 0;
    virtual T operator()(U arg1) = 0;
    virtual T operator()(U arg1, V arg2) = 0;
};

И затем производный класс может реализовать только одну из этих функций?

например

class Test : public Functor<void> {
public:
    void operator()() {
        std::cout << "Called Test::operator()" << std::endl;
    }
};

Причина, по которой у меня есть базовый класс Functor, заключается в том, что я могу хранить функторы в векторе.

Ответы [ 3 ]

2 голосов
/ 28 августа 2011

Да, это возможно. Но производный класс все еще будет абстрактным.

2 голосов
/ 28 августа 2011

Да, это возможно. Однако это означает, что сам производный класс все еще является абстрактным и не может быть реализован, и вам нужно извлекать из него все дальше, пока вы не определите все виртуальные функции.

2 голосов
/ 28 августа 2011

Нет, это невозможно.Что, если вы позвонили T operator()(U) на Test*, а он не реализовал это?В конечном итоге вам потребуется иметь класс, реализующий их все (или наследовать от одного или нескольких классов, реализующих каждый из них), чтобы создать его экземпляр.

Вы можете оставить любое количество виртуальных функций неопределенным, но если высделайте, ваш класс не будет инстанцируемым, потому что он все еще абстрактный.Вы должны будете иметь другой класс, наследующий от него, и определить эти неопределенные функции и создать его экземпляр.

tl; dr: Чтобы создать экземпляр класса, где-нибудь в его иерархии классов все виртуальные функции должны иметь определение.

...