Проживание члена родительского класса в другом классе

#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с, то он просит о неприятностях, а не по моей вине!

0

Решение

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){}
};
2

Другие решения

Я не знаю, как изящно справиться с этим без нарезка объектов.

Единственный способ, которым я мог придумать, — это использовать указатель и создать копию при «вызове» Foo конструктор:

class Foo
{
BarParent* bar;

public:
Foo(BarParent* b) : bar(b) {}
};

BarChild child;

Foo myFoo(new BarChild(child));
0