c ++成员函数绑定

时间:2011-05-10 11:50:34

标签: c++

我读了一本关于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。

感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

这是由slicing引起的。如果分配给超类的对象,则子类中的信息将丢失。问题是这句话:

win    = *txtWinPrt;

由于您将子类(TextWindow)的对象分配给超类(Window)的对象,因此TextWindow的所有信息都不在{{1}中切掉了。

答案 1 :(得分:0)

Window win 

是Window类的对象。它应该是使用基类实例调用派生类方法的指针或引用。

答案 2 :(得分:0)

使用面向对象的动态多态性需要两件事(这是你要求的)。

  1. Window和Textwindow需要实现“is-a”关系。 (所以,class TextWindow : public Window {});
  2. 在base-clase中需要虚函数以获得运行时多态性,如果您无法自然地找到虚函数,通常是析构函数。虚函数会导致编译器放下v表。
  3. 如果没有这两件事,编译器就不会在调用时放下v表。 v-tables启用运行时多态性,因为函数调用通过它进行间接调用。

    或者你可以使用c风格的函数指针,或类似boost :: bind的东西。但这会击败OO编程。我个人很少使用v-table。