2013-09-15 4 views
0

я компилирую с помощью g++ -Wall -Werror *.cpp и получаю ошибку:C++ ошибка: декларирование '~ Destructor' членом 'Класс'

ConcreteCharArray.h:21:15: error: declaration of ‘~CharArray’ as member of ‘ConcreteCharArray’

Конкретная реализация:

class ConcreteCharArray: public CharArray 
{ 
private: 
    char * charArray; 
public: 
    ~CharArray() { 
     delete[] string; 
    } 
}; 

Виртуальный класс:

class CharArray 
{ 
public: 
    virtual ~CharArray() {}; 
}; 
+2

переименовать в ~ ConcreteCharArray –

+3

Дедуктор должен быть тем же именем, что и класс, поэтому '~ CharArray' должен быть' ~ ConcreteCharArray'. –

ответ

3

Объявление об объявлении ~CharArray внутри класса с именем ConcreteCharArray является просто незаконным, что компилятор вам сообщает. Присутствие ~ показало, что вы объявляете деструктор, а имя деструктора должно совпадать с именем класса.

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

Итак, если вы хотите объявить деструктор в классе ConcreteCharArray, вы должны позвонить этому деструктору ~ConcreteCharArray. Других вариантов нет. Несмотря на то, что имя производного деструктора отличается от имени базового деструктора, производный деструктор будет рассматриваться как виртуальный и переопределит базовый.

+0

Ну, только дело в том, что деструкторы не переопределены. Если вы реализуете оба деструктора, они вызываются, начиная с дочернего деструктора. – opatut

+1

@opatut: Они * * превышены. Полиморфные вызовы виртуальным деструкторам отправляются в соответствии с обычными правилами виртуальной отправки. «Единственное» здесь состоит в том, что производный деструктор всегда * неявно * вызывает базовые и членные деструкторы, но это совершенно другая история. Это внутреннее поведение деструктора, которое никоим образом не относится к переопределению. – AnT

+0

О, мой, я не достоин давать советы по наследованию на C++: (Но действительно, «переопределение» на естественном языке означает, что «оригинальные вещи ушли», что определенно здесь не так (неявный вызов упомянутого «оригинального материала») так что вы действительно не можете избавиться от виртуального родительского деструктора.Я определенно не назвал бы это типичным случаем переопределения, хотя, технически, это так. – opatut

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