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

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

У меня есть базовый класс A, который имеет чисто виртуальный оператор + =, который принимает экземпляр себя. В производном классе B я хотел бы переопределить оператор + = базового класса так, чтобы он принимал экземпляр B (а не A).

// Abstract base class
template <class T>
class A
{
A() = default;

virtual A<T>& operator+=(const A&) = 0;
}

// Derived class
template <class T>
class B : public A<T>
{
T some_field = 3.14159;

B(const T x) : A(), some_field(x) {}

B<T>& operator+=(const B& b) override
{
this.some_field += b.some_field;

return (*this);
}
}

Я понимаю, почему это не работает; эти два метода являются разными функциями, потому что они ожидают разных аргументов. Однако я предполагаю, что должен быть какой-то способ гарантировать, что любой класс, производный от A, реализует оператор + =, в котором он принимает экземпляр производного класса в качестве аргумента.

virtual operator+=(const <this_class_type>&) = 0;

Пожалуйста, не могли бы вы предложить решение этой проблемы? Спасибо большое!

1

Решение

Одним из способов достижения этого было бы использование T для параметра:

template<typename T>
class IBase
{
public:
virtual IBase& operator+=(const T& Instance) = 0;
};

class CDerived : IBase<CDerived>
{
public:
IBase& operator+=(const CDerived&) override
{
return *this;
}
};

class COtherDerived : IBase<COtherDerived>
{
public:
IBase& operator+=(const COtherDerived&) override
{
return *this;
}
};

int main(int argc, char** argv)
{
CDerived Derived1, Derived2;
Derived1 += Derived2;
COtherDerived Derived3;
// Derived3 += Derived1; <-- Will not compile
}
3

Другие решения

Других решений пока нет …