Рассмотрим следующий пример, когда срез объекта происходит во время разыменования базового указателя.Есть ли механизм в C++ для создания полной копии производного класса из указателя базового класса без выделения динамической памяти?
#include <stdio.h>
class Base {
public:
virtual void hello() {
printf("hello world from base\n");
}
};
class Derived : public Base{
public:
virtual void hello() {
printf("hello world from derived\n");
}
};
int main(){
Base * ptrToDerived = new Derived;
auto d = *ptrToDerived;
d.hello();
}
Я хочу переменную d
для хранения объекта типа Derived
вместо объекта типа Base
без динамического выделения памяти, и без явного приведения.
Я уже рассмотрел this question, но для решения, предлагаемого в ответ, требуется динамическое выделение памяти, поскольку оно возвращает указатель на новый объект вместо значения нового объекта.
Возможно ли это в C++ 11?
Можете ли вы ограничить свою иерархию классов каким-то образом? Если существует ограниченное количество типов, вы можете пойти с 'boost :: variant'. Если вы можете ограничить максимально возможный размер объекта разумным значением, вы можете создать класс интеллектуальных указателей, чтобы управлять им. – milleniumbug
@milleniumbug. На практике производный класс является шаблоном, поэтому я не думаю, что могу его связать. – merlin2011