Допустим, у нас есть следующие два определения класса.
#include <iostream>
#include <array>
class A
{
public:
virtual void f() = 0;
};
class B : public A
{
public:
virtual void f() { std::cout << i << std::endl; }
int i;
};
Здесь sizeof(B) == 8
, предположительно 4 виртуальных указателя и 4 для int
.
Теперь предположим, что мы создаем массив из B, например:
std::array<B, 10> x;
Теперь мы получаем sizeof(x) == 80
.
Если мое понимание верно, все вызовы методов для элементов x
разрешаются статически, так как мы знаем тип во время компиляции. Если мы не сделаем что-то вроде A* p = &x[i]
, я не вижу необходимости даже хранить виртуальный указатель.
Есть ли способ создать объект типа B без виртуального указателя, если вы знаете, что он не будет использоваться?
т.е. тип шаблона nonvirtual<T>
, который не содержит виртуального указателя и на который нельзя указать подтипом T?