Хорошая причина называется виртуальными таблицами. Объекты типов, которые имеют виртуальные методы, имеют таблицу указателей, указывающих на адрес реальных виртуальных методов, которые будут вызваны. Это так называемые виртуальные таблицы или виртуальные таблицы.

жный дубликат:
C ++: почемуnew нужно?

Почему я не могу использовать malloc для выделения пространства для моих объектов, когда они являются детьми класса, содержащего виртуальные функции? Это действительно расстраивает. Есть ли веская причина?

Следующая программа иллюстрирует проблему. Это segfaults в строке 27, где я вызываю aa-> f ()

#include <iostream>
#include <cstdlib>

class A 
{
public:
    virtual int f() {return 1;}
};

class B 
{
public:
    int f() {return 1;}
};

class Aa : public A {};

class Bb : public B {};

int main()
{
    Aa* aa = (Aa*)malloc(sizeof(Aa));
    Aa* aan = (Aa*)new Aa();
    Bb* bb = (Bb*)malloc(sizeof(Bb));
    std::cout << bb->f() << std::endl;
    std::cout << aan->f() << std::endl;
    std::cout << aa->f() << std::endl;
    return 0;
}

Информация о версии: g ++ (Ubuntu / Linaro 4.4.4-14ubuntu5) 4.4.5

Ответы на вопрос(7)

Ваш ответ на вопрос