2016-07-25 6 views
-4
#include <stdio.h> 


class abc{ 
    public: 
     abc  *next; 

    protected: 
     int    flags; 
     const char * name; 
     const char * comments; 

    public: 
     abc(const char *name, const char *comments, int flags); 

     virtual ~abc() { 
      printf("\nReached at virtual ~abc\n"); 
      printf("Returning from at virtual ~abc\n"); 
     } 
}; 

class def: public abc{ 
    public: 
     def (const char *myname, const char *mycomments, 
       int myflags): abc(myname, mycomments, myflags) 
     { 
      printf("\nreached at def\n"); 
      printf("name=%s; comments=%s\n", myname, mycomments); 
      printf("Returning from def\n"); 
     } 
}; 

class ghi: public def{ 
    public: 
     ghi(const char *myname2, const char *mycomments2, 
      int myflags2): def(myname2, mycomments2, myflags2) 
     { 
      printf("\nreached at ghi\n"); 
      printf("name=%s; comments=%s\n", myname2, mycomments2); 
      printf("Returning from ghi\n"); 
     } 
}; 

class jkl: public def{ 
    public: 
     jkl(const char *myname2, const char *mycomments2, 
      int myflags2): def(myname2, mycomments2, myflags2) 
     { 
      printf("\nreached at ghi\n"); 
      printf("name=%s; comments=%s\n", myname2, mycomments2); 
      printf("Returning from ghi\n"); 
     } 
}; 

ghi myVar("myVar", "Testing it", 0); 
jkl myVar2("myVar2", "Testing it Again", 0); 

abc::abc(const char *name, const char *comments, int flags) : next(0){ 
    printf("\nreached at abc::abc\n"); 
    printf("name=%s; comments=%s\n", name, comments); 
    printf("Returning from abc:abc\n"); 
} 



int main(void){ 
    printf("\nrunning main function\n"); 
    printf("ending main function\n"); 
    return 0; 
} 

Выход:C++ Виртуального Наследования

reached at abc::abc 
name=myVar; comments=Testing it 
Returning from abc:abc 

reached at def 
name=myVar; comments=Testing it 
Returning from def 

reached at ghi 
name=myVar; comments=Testing it 
Returning from ghi 

reached at abc::abc 
name=myVar2; comments=Testing it Again 
Returning from abc:abc 

reached at def 
name=myVar2; comments=Testing it Again 
Returning from def 

reached at ghi 
name=myVar2; comments=Testing it Again 
Returning from ghi 

running main function 
ending main function 

Reached at virtual ~abc 
Returning from at virtual ~abc 

Reached at virtual ~abc 
Returning from at virtual ~abc 

Я не понимает:

  • как виртуальная функция ~ а называются?
  • Почему он работает в конце программы?
  • Какова цель функции?
+3

Как вы думаете, а почему вы используете 'virtual' inheritance? Я имею в виду именно это. – Yakk

+0

@Yakk виртуальное наследование не закодировано в примере, но я хочу знать, как вызывается виртуальный ~ abc ..... – Vineet1982

+1

В этой программе нет виртуального наследования. Вы можете пересмотреть свой вопрос. –

ответ

0

~abc является деструктором abc. Это функция, которая уничтожает объект, когда он больше не нужен.

В конце программы каждый объект уничтожен, для чего программа вызывает каждый деструктор. Вы определили свой деструктор для печати этих строк, чтобы он это сделал.

Кроме того, каждый объект дерева наследует от abc, поэтому все они наследуют деструктор. Вы объявляете два объекта: ghi и jkl. Они должны быть уничтожены в конце программы, поэтому они называют деструктор, унаследованный от abc.

Деструкторы используются для уничтожения объектов в обычном режиме, чтобы не было утечки памяти. Например, если ваш объект имеет указатель на что-то еще в нем, вы должны установить этот указатель на nullptr для обеспечения безопасности.

Обратите внимание, что каждый объект имеет деструктор по умолчанию, но по умолчанию он ничего не печатает, поэтому вы не знали, что они существуют.

1

Виртуальное наследство NOT что вы сделали. Вы сделали статическое наследование классов, имеющих виртуальные функции.

И ваши сомнения НЕ связаны с виртуальными функциями.

  1. Глобальные переменные: myVar и myVar2 глобальны: они создаются перед входом в основной и уничтожен после выхода из него. Тот факт, что деструкторы являются или нет виртуальными - в этом случае - не имеет значения.
  2. Конструкторы называются в порядке членства и деривации. Деструкторы вызываются в обратном порядке по отношению к конструкторам. abd вызывается в цепи уничтожения как def, так и ghi. Вы не видите этого, так как вы не делали ghi и def деструкторов многословными.

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

Если вы работаете непосредственно со значением переменной, виртуальная отправка не используется.

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