2015-01-23 3 views
0

Можно ли вызвать деструктор по умолчанию, даже если я переопределил деструктор для класса на C++? например, если у меня есть два классастандартный деструктор при переопределении деструктора

class B{ 
    ... 
}; 

class A{ 
private: 
    B* p; 
public: 
    A(B b):p(new B(b)){...} 
    ... 
    ~A(){delete p;} 
}; 

и я не всегда хочу удалить объект, на который указывает p.

+1

Ваш пример не имеет смысла. Почему вы не хотите удалить 'p'? –

+1

FYI 'delete nullptr;' законно и гарантированно ничего не делать. Таким образом, вы можете захотеть 'p = nullptr;' –

+0

@MooingDuck: Если вы передали право собственности на память на другой компонент, возможно? –

ответ

2

Деструктор имеет только одну возможную подпись, поэтому вы не можете определить несколько версий.

6

Предполагая, что «стандартный деструктор» означает, что ваш компилятор сгенерировал по умолчанию, Ответ №. Поскольку вы определили свой собственный деструктор, компилятор просто не генерирует значение по умолчанию. В любом случае деструкторы не должны «вызываться» как обычная функция (если вы не реализуете что-то вроде контейнера STL).

Если вам нужно, чтобы ваш деструктор выполнял разные вещи в разных обстоятельствах, поместите if() в деструктор и попросите объект отслеживать любую информацию, необходимую для условия if(). В любом случае, это лучший дизайн.