У меня проблемы с наследованием классов C ++.У меня есть класс, который имеет виртуальный метод, например:
class IFoo {
public:
virtual int sayFoo() = 0;
};
И у меня есть несколько реализаций, например:
class Foo1: public IFoo {
public:
virtual int sayFoo() {
return 1;
}
};
class Foo2: public IFoo {
public:
virtual int sayFoo() {
return 2;
}
};
Я хочу держать IFoo
экземпляр в пустышкеконтейнерный класс (как своего рода обертка), открывающий тот же интерфейс IFoo
:
class DummyWrapper : public IFoo {
public:
DummyWrapper(IFoo& foo): foo{foo} {}
virtual int sayFoo() {
return foo.sayFoo(); //ALPHA
}
private:
IFoo& foo; //BETA
};
Обычно все должно работать, например, так:
IFoo& foo = Foo1{};
DummyWrapper wrapper{foo};
wrapper.sayFoo();
Моя проблемачто foo
на самом деле является просто r-значением, которое удаляется после того, как выходит его область действия, как здесь:
DummyWrapper generateWrapper() {
return DummyWrapper{Foo1{}};
}
Это приводит к проблемам чтения в строке "ALPHA".Решением было бы поместить значение r в кучу и использовать указатели для доступа к foo.Так как я новичок в C ++ и, возможно, я попал в проблему XY, мой вопрос:
- это единственное решение?Разве нет лучшего способа для решения проблемы?
- Я не думаю, что смогу заменить строку "BETA" на
IFoo foo
, так как таким образом DummyWrapper
всегда будет хранить байтыIFoo
, а не IFoo
реализации.Или, может быть, я могу использовать значение IFoo foo
для вызова производных виртуальных методов?
Спасибо за любой ответ