Как назвать все деструкторы базового класса? (или общая функция) - PullRequest
0 голосов
/ 26 апреля 2019

Мне интересно, есть ли какой-нибудь элегантный способ сделать это;

template<typename tType>
class A
{
   ...
};

class B : A<type1>, A<type2>, A<type3> ...
{
public:
  void CallBaseDestructors()
  {
    A<type1>::~A();
    A<type2>::~A();
    A<type3>::~A();
    ...

    //Or Something like that...

    A<type1>::DoSomething();
    A<type2>::DoSomething();
    A<type3>::DoSomething();
    ...
  }
};

Это не должно быть деструктором.Также нормально, если функцию, подобную A<>::Foo(), можно вызывать из B, но не дополнительный вызов (строка кода) для каждой базы (цикл в порядке).

1 Ответ

4 голосов
/ 26 апреля 2019

Во-первых, вы не должны вручную вызывать деструкторы базового класса. Вызов деструктора для «хардкорной» работы с размещением новых; ваш пример - ошибка, потому что вы в конечном итоге уничтожите вещи «дважды», и ваша программа будет иметь неопределенное поведение.

В сущности вопроса: как повторить вызов данной функции для всех баз, не выписывая их все? Боюсь, вы не можете (если вы не унаследовали от пакета параметров). С ++ не имеет отражения , которое в противном случае могло бы позволить вам циклически переключаться между типами базовых классов.

К счастью, это очень редкая вещь, и даже тогда редко бывает так много баз , что проблема состоит в нескольких повторяющихся строках. И, опять же, здесь вы не представили хорошего обоснования для этого.

...