2016-07-25 182 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 

我不明白:

  • 又是怎樣的功能虛擬〜ABC叫什麼名字?
  • 它爲什麼在程序結束時運行?
  • 功能的目的是什麼?
+3

你認爲你在哪裏使用'虛擬'繼承?我的意思是,引用它。 – Yakk

+0

@Yakk虛擬繼承沒有在例子中編碼,但我想知道如何調用虛擬〜abc ..... – Vineet1982

+1

在這個程序中沒有虛擬繼承。你可能想重新考慮你的問題。 –

回答

0

~abcabc的析構函數。當它不再需要時,這是一個在那裏銷燬對象的函數。

在程序結束時,每個對象都被銷燬,程序調用每個析構函數。你定義了你的析構函數來打印這些行,所以它確實如此。

此外,樹中的每個對象都繼承自abc,所以它們都繼承了析構函數。您聲明瞭兩個對象ghijkl。它們必須在程序結束時銷燬,所以他們稱它們從abc繼承的析構函數。

析構函數用於以自定義方式銷燬對象,以便不泄漏內存。例如,如果你的對象有一個指向其他東西的指針,爲了安全起見,你可以將該指針設置爲nullptr

請注意,每個對象都有一個默認的析構函數,但默認情況下它不打印任何東西,這就是爲什麼您不知道它們存在的原因。

1

虛擬繼承是不是你做了什麼。你做了一個具有虛函數的類的靜態繼承。

而你的疑惑與虛擬功能無關。

  1. 全局變量:myVarmyVar2是全球性的:他們在進入主之前創建的,它退出後銷燬。在這種情況下,析構函數是虛擬的還是不虛擬的......是無關緊要的。
  2. 構造函數按成員資格和派生順序調用。析構函數按照構造函數的相反順序調用。在defghi的銷燬鏈中調用abd。你沒有看到它,因爲你沒有使ghidef析構函數冗長。

通過虛函數的運行時多態性需要指針或對基的引用。

如果您直接使用值變量,則不使用虛擬分派。