首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >c++成员函数绑定

c++成员函数绑定
EN

Stack Overflow用户
提问于 2011-05-10 19:50:34
回答 3查看 269关注 0票数 0

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

它给出了下一个例子:

代码语言:javascript
运行
复制
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。

谢谢你的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-10 19:52:14

这是由slicing引起的。如果赋值给超类的对象,则来自子类的信息将丢失。问题是下面这句话:

代码语言:javascript
运行
复制
win    = *txtWinPrt;

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

票数 3
EN

Stack Overflow用户

发布于 2011-05-10 19:54:02

代码语言:javascript
运行
复制
Window win 

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

票数 0
EN

Stack Overflow用户

发布于 2011-05-10 19:54:35

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

  1. Window和Textwindow需要实现"is-a“关系。(因此,为了获得运行时多态性,基类中需要class TextWindow : public Window {});
  2. A虚函数,如果不能自然地找到虚函数,则通常是析构函数。虚函数会使编译器生成一个v表。

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

或者,您可以求助于c风格的函数指针,或者类似于boost::bind的函数指针。但这击败了面向对象编程。我个人很少使用v-table。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5949555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档