C++ 成员函数绑定

c++ member function binding

本文关键字:绑定 函数 成员 C++      更新时间:2023-10-16

我读了一本关于 c++ 中成员函数绑定问题的书。

它给出了下一个示例:

void Window::oops()  { printf("Window oopsn"); } 
void TextWindow::oops() { 
printf("TextWindow oops %dn", 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被定义为文本窗口。

谢谢你的帮助。

这是

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

win    = *txtWinPrt;

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

Window win 

是窗口类的对象。它应该是指针或引用,以调用具有基类实例的派生类方法。

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

    窗口
  1. 和文本窗口需要实现"is-a"关系。(所以,class TextWindow : public Window {});
  2. 为了获得运行时多态性,在基序列中需要一个虚函数,如果您无法自然地找到虚函数,则通常是一个析构函数。虚函数会导致编译器放下向量表。

如果没有这两件事,编译器就不会在调用站点放置一个v-table。向量表支持运行时多态性,因为函数调用是通过它间接进行的。

或者,

你可以求助于c风格的函数指针,或者像boost::bind这样的东西。但这击败了OO编程。我个人很少使用V表。