我读了一本关于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。
感谢您的帮助。
答案 0 :(得分:3)
这是由slicing引起的。如果分配给超类的对象,则子类中的信息将丢失。问题是这句话:
win = *txtWinPrt;
由于您将子类(TextWindow
)的对象分配给超类(Window
)的对象,因此TextWindow
的所有信息都不在{{1}中切掉了。
答案 1 :(得分:0)
Window win
是Window类的对象。它应该是使用基类实例调用派生类方法的指针或引用。
答案 2 :(得分:0)
使用面向对象的动态多态性需要两件事(这是你要求的)。
class TextWindow : public Window {}
); 如果没有这两件事,编译器就不会在调用时放下v表。 v-tables启用运行时多态性,因为函数调用通过它进行间接调用。
或者你可以使用c风格的函数指针,或类似boost :: bind的东西。但这会击败OO编程。我个人很少使用v-table。