Re[11]: Перегрузка методов базовых классов при множественном наследовании (msvc)
От: B0FEE664  
Дата: 10.07.13 14:41
Оценка:
Здравствуйте, 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
как и остальные методы.
И каждый день — без права на ошибку...
Re[9]: Перегрузка методов базовых классов при множественном наследовании (msvc)
От: Molchalnik  
Дата: 10.07.13 15:10
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Molchalnik, Вы писали:


M>>паттерн "Шаблонная функция" спасёт отцов русской демократии, см. мой предыдущий пост


К>Паттерн "переименовать методы" спасёт отцов русской демократии ещё быстрее.

К>Шаблонная функция противоречит стилю кодирования в компании автора.

"Заметным ограничением выступает Coding Style/Guidelines, принятый командой, — не определять функций в объявлениях интерфейсов (в заголовках, впрочем, тоже)."
Я когда прочитал эту фразу, не подумал, что следование coding style может доходить до глупости.

Данное правило очень разумно, так как вместе с правилом о том, что функции определяются один и только один раз, в реализации, позволяет отслеживать не переопределённые функции. Так же при множественном наследовании это избавляет от геморроя. Полезная практика.

Но запрещать на этом основании паттерн "шаблонная функция" и невиртуальный интерфейс — это уже перебор, т.к. противоречит целям введения правила, точнее, не способствует им.
Это позор программирования — пусть здравый смысл и целесообразность горит синим пламенем, главное, что я я CodeStyle соблюл
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.