Я понимаю, почему вы не можете просто нарисовать указатель функции элемента производного класса на указатель функции элемента базового класса, как описано here.Листинг виртуального переопределения на базовый чистый виртуальный член
Но, учитывая этот фрагмент:
struct base
{
virtual void foo() = 0;
};
struct derived : base
{
void foo() override {};
};
struct invoker
{
typedef void(base::*target)();
invoker(base* b, target t)
{
(b->*t)();
}
};
template<typename B, typename D>
void (B::*cast(void (D::*method)()))()
{
return static_cast<void(B::*)()>(method);
}
derived d;
invoker bad(&d, &derived::foo); //C2664
invoker good(&d, cast<base>(&derived::foo));
Я хотел спросить, можно ли украсить базовую функцию подписи, так что компилятор понимает это чисто виртуальный метод и и он будет реализован где-то по иерархии (иначе я не смог бы построить объект типа B
)? Я понимаю, почему я не могу сделать это с помощью обычных функций, но IMHO в случае чистой виртуальной функции у компилятора есть гарантия, что он будет реализован (в случае, если это не было сделано, я бы получил ошибку о классе B
не о бросать).
Непонятно, какое оформление вы просите. Если бы вы были высшим руководителем проектного комитета C++, что бы вы сделали? Не беспокойтесь о последовательности или правильности, просто покажите, что вы хотите добавить в C++. Если вы просто хотите сообщить компилятору, что 'base :: foo' существует в' base', вы можете просто написать '& base :: foo'. –
@ н.м. Я хочу избежать явного приведения в действие: D Но это был скорее вопрос «есть ли способ, которым я не знаю» типа вопроса. –
Нет, не делайте бросок. Просто начните с '& base :: foo'. Что делает '& производное :: foo' делать то, что' & base :: foo' не может? –