Ошибка при переопределении не-виртуальной функции в C ++ - PullRequest
0 голосов
/ 02 ноября 2011

Когда вы переопределяете функцию-член, которая не является виртуальной, в классе без виртуальных функций, компиляторы VS выдают ошибку «_BLOCK_TYPE_IS_VALID».

Например,

class A{
public:
    int a;
public:
    void func(){}
    ~A(){}
};

class B : public A{
public:
    virtual void func(){}

    ~B(){}
};

int main(void){
    A* a = new B();
    delete a;  // error!

    return 0;
}

Я полагаюэто потому, что в main () a имеет vtable, но компилятор пропускает его и не может получить точный размер заголовка?

Кто-нибудь может получить мое любопытство по поводу этого разбитого?

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 02 ноября 2011

Вы можете удалить A::func(), и программа по-прежнему ошибочна.

Реальная причина в том, что A::~A() (не B::~B()) вызывается для объекта типа B.

См. C ++ FAQ § 20.7"Когда мой деструктор должен быть virtual?"

1 голос
/ 02 ноября 2011

Вы пытаетесь уничтожить объект, используя указатель на базовый класс, но деструктор не является виртуальным.Если класс является частью иерархии наследования, всегда делает dtors виртуальными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...