4

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

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

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

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

Но та же функция Destroy, которая находится в вызове Base destructor, является базовой виртуальной функцией 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

Я не понимаю, что ваш пример кода имеет отношение к вашему вопросу. Пожалуйста, не могли бы вы уточнить, что деструкторы должны делать с чем угодно? –

+0

@Oil Charlesworh: В основном вызов Destroy fun вызывает правильную виртуальную функцию. Я ожидаю, что любой вызов функции Destroy должен вызвать правильное виртуальное развлечение. Связано ли это со статической привязкой в ​​Destructor. Но та же функция Destroy, которая находится в вызове базового деструктора, является базовой виртуальной функцией . – vrbilgi

+1

У вас есть четкое представление о вызове виртуальных функций в конструкторе/деструкторе, и вы задаете такие вопросы. WTF? –

ответ

5

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

+0

@Oil Charlesworth: Спасибо за разъяснение. Тогда их нет взлома для достижения динамического связывания в конструкторе и деструкторе. – vrbilgi

+0

@ user430294: передать указатель на функцию? –

+0

@Matthieu: вызов указателя-функции для объекта, не принадлежащего этому классу, приведет к неопределенному поведению. –

Смежные вопросы