Косвенный вызов виртуальной функции из Destructor - PullRequest
4 голосов
/ 30 января 2011

Позвольте мне сделать это заявление об отказе: У меня есть четкое понимание вызова виртуальной функции в конструкторе или деструкторе.

В приведенном ниже коде я пытаюсь избежать виртуальногодеструктор ТОЛЬКО ДЛЯ ЭКСПЕРИМЕНТАЛЬНОЙ цели.

Теперь мой вопрос:

В основном вызов Destroy fun вызывает правильную виртуальную функцию.Я ожидаю, что любой вызов функции Destroy должен вызывать правильное виртуальное удовольствие.

Но та же самая функция Destroy, помещенная в вызов базового деструктора, является базовой функцией Base.

Это связано со статическим связыванием или компиляторомоптимизация?

class Base
{
public:
      Base()
      {
      }
      void Destroy()
      {
            callVirtual();
      }
      virtual void callVirtual()
      {
            cout<<"In Base callVirtual "<<endl;
      }
      ~ Base()
      {
           cout<<"In Base Destructor"<<endl;

           Destroy();
      }
};

.

class Derived : public Base
{
   public:
           Derived()
           {
           }
           void callVirtual()
           { 
               cout"<<In Derived callVirtual"<<endl;
           } 
};

.

int main()
{
    Base *pointer = new Derived();

    pointer->Destroy();    // Calls the right callVirtual

 return 0;

}

1 Ответ

5 голосов
/ 30 января 2011

В деструкторе динамический тип this - это тип текущего класса, а не исходный динамический тип объекта.См. Например http://www.artima.com/cppsource/nevercall.html.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...