вызов чистой виртуальной функции в деструкторе -- как быть?
От: konst  
Дата: 29.01.04 10:58
Оценка:
Студия 7.1. Стандарта в руках нет. Натолкнулся на такое:
class A
{
public:
  virtual ~A();
private:
  virtual void foo() = 0;
};

A::~A()
{
  foo();
}

Компилит, но не линкует, говорит, что
error LNK2019: unresolved external symbol "private: virtual void __thiscall A::foo(void)" (?foo@A@@EAEXXZ) referenced in function "public: virtual __thiscall A::~A(void)" (??1A@@UAE@XZ)
А если сделать так:
class A
{
public:
  virtual ~A();
private:
  virtual void foo() = 0;
  void Dtor();
};

void A::Dtor()
{
  foo();
}

A::~A()
{
  Dtor();
}

То и компилится и линкиется. Вот задумался, наверное, люди не зря сделали так, чтобы нельзя было чистую виртуальную функцию вызывать из деструктора, ну, напрмер, чтоб исключения не могло быть по причине того, что функция не реализована...Хорошее это решение через обёрточную функцию и не приведёт ли к проблемам в дальнейшем?
А сделал так вот почему: есть шаблон "наблюдатель", "субъект" вызывает у "подписчиков" при уничтожении OnDelete, что я в деструктор и запихнул; конкретный класс субъекта наследутся от интерфейса субъекта, а реализует все присущие субъекту функции шаблонный класс, ну, вот таким примерно образом:
// класс A остаётся
template <class A>
class B: public A
{
private:
  virtual void foo()
  {
     // какой-то код, одинаковый для всех наследников A
  }
};


Правильный это дизайн или нет, или как лучше?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.