Код: Выделить всё
class DerivedA: public Base
{
void operation(const Base& x, const Base& y) override // pure virtual in Base
{
const DerivedA& xd = dynamic_cast (x);
const DerivedA& yd = dynamic_cast (y);
xd.some_method();
yd.some_method();
}
};
Но я хочу слегка обобщить это, чтобы позволить x и y иметь либо DerivedA, либо DerivedB, потому что теперь и DerivedA, и DerivedB реализуют some_method.
Один, казалось бы, ужасный способ сделать это, аналогичный связанному вопросу, заключается в следующем:
Код: Выделить всё
class DerivedA: public Base
{
void operation(const Base& x, const Base& y) override // pure virtual in Base
{
const DerivedA& xda = dynamic_cast (x);
const DerivedB& xdb = dynamic_cast (x);
const DerivedA& yda = dynamic_cast (y);
const DerivedB& ydb = dynamic_cast (y);
if (xda != NULL && yda != NULL)
{
// use xda and yda
}
else if
// repeat same code...
// try all the combinations...
}
}
В качестве альтернативы, лучше ли попытаться проверить, существует ли some_method в объектах x и y, и в противном случае выдать ошибку? Кажется, это тоже довольно сложно.
Я пытался сделать операцию в DerivedA шаблоном, шаблоном , но поскольку предполагается, что он переопределяет чистый виртуальный элемент в Base, я получаю ошибки, сообщающие, что функция никогда не реализуется.
Подробнее здесь: https://stackoverflow.com/questions/798 ... al-options
Мобильная версия