我读过一本关于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会执行window版本?win被定义为Textwindow。
谢谢你的帮助。
发布于 2011-05-10 19:52:14
这是由slicing引起的。如果赋值给超类的对象,则来自子类的信息将丢失。问题是下面这句话:
win = *txtWinPrt;由于您将子类(TextWindow)的对象分配给父类(Window)的对象,因此所有不在TextWindow中的Window信息都会被切片。
发布于 2011-05-10 19:54:02
Window win 是Window类的对象。它应该是用基类实例调用派生类方法的指针或引用。
发布于 2011-05-10 19:54:35
使用面向对象的动态多态性需要两件事(这就是您所要求的)。
class TextWindow : public Window {});如果没有这两件事,编译器将不会在调用站点中放置一个v-table。v-tables支持运行时多态性,因为函数调用是通过它间接进行的。
或者,您可以求助于c风格的函数指针,或者类似于boost::bind的函数指针。但这击败了面向对象编程。我个人很少使用v-table。
https://stackoverflow.com/questions/5949555
复制相似问题