#include <iostream>
class BarParent
{
virtual void fuz()
{
std::cout << "BarParent" << std::endl;
}
};
class BarChild : public BarParent
{
virtual void fuz()
{
std::cout << "BarChild" << std::endl;
}
};
class Foo
{
// ??BarParent bar;??
public:
Foo(BarParent bar);
};
Что я ищу, так это хранить копия из BarParent
который передается конструктору, и пусть он находится в Foo
в то время как по-прежнему зовет правильный virtual function
Это встроенное приложение: использование кучи не одобряется. Так желательно, без кучи
РЕЗЮМЕНасколько известно, это не может быть сделано, потому что проблема нарезки (Короче говоря, компилятор не может определить размер универсального Bar
и так далее при копировании типа бросает), поэтому полиморфизм не может быть достигнут. Использование шаблонов может быть хорошей идеей, однако, оно определяет несколько class
эс Foo<typename BarType>
в результате чего function
такие как changeBar(BarParent)
, было бы невозможно, так как компилятор определил бы это как changeBar(BarType)
определяется только для класса Foo<Bartype>
, Если у кого-то есть идея получше, пожалуйста, дайте мне знать.
Я думаю, что мне придется пойти на кучу, или const Barparent
и указатели. Если пользователь const_cast
с, то он просит о неприятностях, а не по моей вине!
class Foo
{
BarParent* bar; //or std::unique_ptr<>
public:
Foo(BarParent* barInst):bar(barInst){}
};
Это будет делать то, что вы хотите. Вы храните указатель на BarParent
объект, и вы можете полиморфно (это слово?) вызывать виртуальные функции, используя его.
Вам нужно создать копию вне конструктора (в куче или иным образом) и передать указатель на нее foo
конструктор объекта. В качестве альтернативы вы можете реализовать метод клонирования, как описано в Копирование производных сущностей с использованием только указателей базового класса (без исчерпывающего тестирования!) — C ++
принципиально иной подход будет использовать шаблоны.. это оставило бы вас с multidudes foo<>
типы, хотя .. Если вы не собираетесь переназначить bar
объект или хранить все foo
в контейнере это может быть лучшим вариантом для вас, так как он не включает в себя кучу
template<typename BarType>
class Foo
{
BarType bar; //pointer not needed any more since we are storing the exact type.
public:
Foo(BarType& barInst):bar(barInst){}
};
Я не знаю, как изящно справиться с этим без нарезка объектов.
Единственный способ, которым я мог придумать, — это использовать указатель и создать копию при «вызове» Foo
конструктор:
class Foo
{
BarParent* bar;
public:
Foo(BarParent* b) : bar(b) {}
};
BarChild child;
Foo myFoo(new BarChild(child));