Все экземпляры будут POD
Здесь есть грубое недоразумение.
Существует очень существенная разница между классом с виртуальными методами и не POD: конструкторы копирования существуют по причине.
Простой пример (упрощенный):
template <typename T>
class unique_ptr {
public:
unique_ptr(): _ptr(nullptr) {}
explicit unique_ptr(T* p): _ptr(p) {}
unique_ptr(unique_ptr const&) = delete;
unique_ptr(unique_ptr&& other): _ptr(other._ptr) { other._ptr = 0; }
unique_ptr& operator=(unique_ptr other) {
std::swap(_ptr, other._ptr);
return *this;
}
~unique_ptr() { delete _ptr; }
T& operator*() const { return *_ptr; }
T* operator->() const { return _ptr; }
private:
T* _ptr;
}; // class unique_ptr<T>
Этот класс является POD с точки зрения макета.Однако memcpy
было бы вопиющим нарушением условий использования и привело бы к неопределенному поведению: конструктор копирования был удален по причине!
Пока нет виртуального метода.
Любой классчто владеет памятью, прямо или косвенно, это не POD.Учитывая количество классов в реальном использовании, которое включает std::string
... это довольно распространенный сценарий.
А как насчет Go тогда?Существует сборщик мусора ...
Теперь это не означает, что классы должны создаваться с помощью виртуальных методов (и, следовательно, виртуальных указателей), но это, безусловно, проще сделать.Я лично фанат Shims, однако возникают проблемы с владением памятью / сроками жизни объектов.