簡體   English   中英

C ++成員函數綁定

[英]c++ member function binding

我讀了一本書,其中涉及c ++中的成員函數綁定問題。

並給出了下一個示例:

void Window::oops()  { printf("Window oops\n"); } 
void TextWindow::oops() { 
printf("TextWindow oops %d\n", cursorLocation);

Window      win; 
Window     *winPtr;
TextWindow *txtWinPrt = new TextWindow; 
win    = *txtWinPrt; 
winPtr =  txtWinPtr;
win.oops();     // executes Window version 
winPtr->oops(); // executes TextWindow or Window version;

我不明白為什么win.oops將執行窗口版本? win被定義為Textwindow。

謝謝您的幫助。

這是由切片引起的。 如果分配給超類的對象,則子類中的信息將丟失。 問題是這樣的聲明:

win    = *txtWinPrt;

由於您將子類的對象( TextWindow )分配給超類的對象( Window ),因此,不在WindowTextWindow所有信息都將被切掉。

Window win 

是Window類的對象。 它應該是使用基類實例調用派生類方法的指針或引用。

使用面向對象的動態多態性需要兩件事(這就是您要的)。

  1. Window和Textwindow需要實現“是”關系。 (因此, class TextWindow : public Window {} );
  2. 為了獲得運行時多態性,基本語句中需要虛擬函數,如果您無法自然地找到虛擬函數,則通常是析構函數。 虛函數使編譯器放下v表。

沒有這兩件事,編譯器將不會在調用站點放置v表。 當通過函數表間接調用函數時,v表啟用了運行時多態。

或者,您可以求助於c樣式的函數指針,或諸如boost :: bind之類的東西。 但這打敗了OO編程。 我個人很少使用v表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM