[英]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
),因此,不在Window
的TextWindow
所有信息都將被切掉。
Window win
是Window類的對象。 它應該是使用基類實例調用派生類方法的指針或引用。
使用面向對象的動態多態性需要兩件事(這就是您要的)。
class TextWindow : public Window {}
); 沒有這兩件事,編譯器將不會在調用站點放置v表。 當通過函數表間接調用函數時,v表啟用了運行時多態。
或者,您可以求助於c樣式的函數指針,或諸如boost :: bind之類的東西。 但這打敗了OO編程。 我個人很少使用v表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.