Скажем, у меня есть следующий абстрактный класс:
class AbstractClass {
public:
AbstractClass() {}
virtual ~AbstractClass() {}
virtual void virtMethod()
{
printf( "%p\n", this );
}
void method()
{
printf( "%p\n", this );
}
...
};
И следующие дочерние классы:
class RawClass : public AbstractClass
{
public:
RawClass();
~RawClass();
...
};
class Wrapper : public AbstractClass
{
public:
Wrapper( AbstractClass* wrapee ) : _wrappee ( wrappee ) {}
~Wrapper() {};
void virtMethod()
{
_wrappee->virtMethod();
}
...
private:
AbstractClass _wrappee;
};
Теперь скажите, что я делаю следующее:
RawClass* r = new RawClass();
Wrapper* w = new Wrapper( r );
w->virtMethod(); // This prints the address of r
w->method(); // This prints the address of w
Я хотел бы, чтобы звонки на w->method()
вели себя так же, как звонки на w->virtMethod()
. Тем не менее, я не могу сделать это без виртуализации method()
и написания его реализации в Wrapper
, которая просто вызывает RawClass::method()
.
У меня явно есть некоторые проблемы с дизайном, но я не могу найти способ заставить это работать, хотя RawClass
и Wrapper
предписывают один и тот же интерфейс.
Любая помощь будет принята с благодарностью.