2016-09-19 4 views
-4

У меня есть три классаC++ виртуальных определений деструкторов

class A { 
    // pure virtual funcs and member vars 
    virtual ~A(); 
} 

class B : public A { 
    // some more pure virtual funcs 
    virtual ~B(); 
} 

class C : public B { 
    // concrete implementations 
    ~C() {} 
} 

В настоящее время это не компилируется с «неопределенной ссылкой на` TypeInfo»ошибки (~ B() не определен, легко поправимо), однако я задается вопросом, нужно ли просто определять «virtual ~ B {}» или что C должен быть виртуальным и определенным, поэтому вызовы ~ B отправляются в ~ C?

+0

** - 1 ** Это ** не настоящий код **. Мы не знаем, что еще вы пропустили, помимо упущений, которые мешают ему компилировать. –

+1

Чистые виртуальные функции должны заканчиваться на a = 0; 'virtual ~ A() = 0;' –

+0

У вас ошибка компоновщика, а не ошибка компилятора. Кроме того, все деструкторы в вашем коде являются виртуальными; переопределяющие функции неявно виртуальны. –

ответ

0

Предполагая, что речь идет о чисто виртуальном деструкторе (код не является реальным, так что трудно сказать, но вы говорите о пропавшем определении деструктора, и о чистых виртуалах):

Чистого виртуальный деструктор, который можно вызвать, должен быть определен.

Вы не можете определить его в определении класса.

Там нет четкой причины, почему она должна быть определена внешними по отношению к определению класса, за исключением старого замечанием Бьярне Страуструп (язык создателя), который он рассматривал = 0 как указание “ ” нет тела.


Пример.

struct S 
{ 
    virtual ~S() = 0; 
}; 

S::~S() {} 
+0

Почему мы не можем просто определить его как пустой деструктор в определении класса (абстрактного класса 'A')? – dfri

+0

@ πάνταῥεῖ: Нет, я имел в виду определение класса. Деструктора. –

+1

@dfri: Если вы определяете его как пустой деструктор, тогда он уже не является чисто виртуальным. –

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