2012-01-07 3 views
0

На этот вопрос встает вопрос: Correct way to inherit from a virtual class with non-virtual parent.Правильный способ унаследовать от виртуального класса с не виртуальным родителем продолжение

Насколько я понимаю, что в случае, описанном в вопросе, три и две части нового выделенного объекта протекают, потому что они не разрушаются?

Источник:

#include <iostream> 

struct One 
{ 
    ~One() { 
     std::cout << "~One()\n"; 
    } 
}; 

struct Two : One 
{ 
    virtual ~Two() { 
     std::cout << "~Two()\n"; 
    } 

    virtual void test() = 0; 
}; 

struct Three : Two 
{ 
    virtual ~Three() { 
     std::cout << "~Three()\n"; 
    } 

    virtual void test() { 
     std::cout << "Three::test()\n"; 
    } 
}; 

int main() 
{ 
    Two* two = new Three; 
    two->test(); 

    One* one = two; 
    delete one; 
} 
+2

Да, это правильно. Я просто [ответил на аналогичный вопрос] (http://stackoverflow.com/questions/8764353/what-does-has-virtual-method-but-non-virtual-destructor-warning-mean-durin/8764393#8764393) вчера , –

+0

Не могли бы вы изменить свой вопрос, включив контекст, чтобы нам не нужно было следовать ссылке, чтобы узнать, что такое «два» и «три». –

+0

@OliCharlesworth сделано – inf

ответ

1

Да, это правильно. Определение утечки памяти - это ситуация, когда вы не можете удалить что-то, что вы создали (и чья жизнь вы, следовательно, ответственны за управление).

Как answers на этот вопрос указует, delete one вызывает неопределенное поведение (которое в большинстве случаев, вероятно, перевести на обычную старую утечку памяти, но все может быть так плохо, как nasal demons), так как тип выполнения указанного объекта не соответствуют его статическому (объявленному) типу, а статический тип не имеет виртуального деструктора.

Применимый участок от стандарта С ++ это одно:

§5.3.5/3: В первом варианте (удалить объект), если статический тип операнда отличается от своего динамического типа , статический тип должен быть базовым классом динамического типа операнда, а статический тип должен иметь виртуальный деструктор или поведение не определено.

Решение либо объявить все деструкторов virtual, или не удалять объекты с помощью указателя на One.

 Смежные вопросы

  • Нет связанных вопросов^_^