Итак задача: у нас есть сторонняя библиотека, есть класс (назовем его Base). Существует скрытая реализация, предоставляемая библиотекой, называемой Impl. Мне нужно написать прокси. К сожалению, в Base есть защищенная виртуальная функция fn.
Итак, вопрос в том, насколько приведенный ниже код верен с точки зрения C++? В настоящее время он отлично работает в Visual Studio и не работает в clang/gcc на Mac (но компилируется без каких-либо предупреждений). Я прекрасно понимаю механизмы, которые там происходят, так что если убрать класс Problem, то все работает на обеих платформах. Я хотел бы знать, должен ли я сообщить об ошибке в clang или о неопределенном/неуказанном поведении стандарта С++.
Ожидаемый результат кода - обычный вызов Impl::fn()
class Base
{
protected:
virtual void fn(){}
};
class Impl : public Base
{
public:
Impl() : mZ(54){}
protected:
virtual void fn()
{
int a = 10; ++a;
}
int mZ;
};
class Problem
{
public:
virtual ~Problem(){}
int mA;
};
class Proxy : public Problem, public Base
{
public:
virtual void fn()
{
Base * impl = new Impl;
typedef void (Base::*fn_t)();
fn_t f = static_cast<fn_t>(&Proxy::fn);
(impl->*f)();
delete impl;
}
};
int main()
{
Proxy p;
p.fn();
}