Здравствуйте, Evgeny.Panasyuk, Вы писали:
BFE>>Это было сделано, чтобы показать на необходимость виртуализации деструкторов
EP>В том то и дело, что такой необходимости нет
EP>А есть выбор — virtual или protected. Делая такой выбор программист сообщает свои намерения.
Намерения — да..., а вот практика показывает, что если есть хотя бы одна виртуальная функция, то не имеет смысла не делать деструктор виртуальным.
Если бы в следующем коде деструкторы изначально были бы объявлены виртульными, то ошибки бы не было:
| | Скрытый текст |
| | class IReader
{
public:
virtual void Release() = 0;
protected:
//virtual
~IReader() {}
};
class IReaderImpl : public IReader
{
public:
IReaderImpl() : m_count(1) {}
virtual void Release()
{
m_count--;
if ( m_count <= 0 )
delete this;
}
protected:
//virtual
~IReaderImpl() {}
private:
int m_count;
};
class IWriter
{
public:
virtual void Release() = 0;
protected:
~IWriter() {}
};
class IWriterImpl : public IWriter
{
public:
IWriterImpl() : m_count(1) {}
virtual void Release()
{
m_count--;
if ( m_count <= 0 )
delete this;
}
protected:
~IWriterImpl() {}
private:
int m_count;
};
class OMyGod : public IReaderImpl, public IWriterImpl
{
public:
virtual void Release()
{
IReaderImpl::Release();
}
protected:
~OMyGod()
{
std::cout << "I expected to die" << std::endl;
}
private:
char m_nom[1000000];
};
void MakeDie(IReader* p)
{
p->Release();
}
int main()
{
for(int i = 0; i < 10; i++)
{
IReader* pOMyGod = new OMyGod();
MakeDie(pOMyGod);
// all right?
}
std::cout << "Press any key to exit..." << std::endl;
char ch = _getch();
return 0;
}
|
| | |
BFE>>которая у VladEC в исходном посте отсутствует. И только.
EP>В исходном сообщении они вообще private
как и остальные методы.