C++ 成员函数绑定
c++ member function binding
我读了一本关于 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
是窗口类的对象。它应该是指针或引用,以调用具有基类实例的派生类方法。
使用面向对象的动态多态性需要两件事(这是您所要求的)。
- 窗口
- 和文本窗口需要实现"is-a"关系。(所以,
class TextWindow : public Window {}
); - 为了获得运行时多态性,在基序列中需要一个虚函数,如果您无法自然地找到虚函数,则通常是一个析构函数。虚函数会导致编译器放下向量表。
如果没有这两件事,编译器就不会在调用站点放置一个v-table。向量表支持运行时多态性,因为函数调用是通过它间接进行的。
或者,你可以求助于c风格的函数指针,或者像boost::bind这样的东西。但这击败了OO编程。我个人很少使用V表。
相关文章:
- 传递给 lambda C++绑定函数
- 是否可以将绑定函数存储在容器中?
- C++绑定函数到指针
- 我正在尝试制作一个在 std::bind 之前匹配的网络绑定函数
- 用emscripten中的参考参数绑定函数
- C++-模板函数接受绑定函数作为参数并将其传递给另一个函数
- 将绑定函数分配给 std::函数
- C++中的绑定函数结果
- 绑定函数而不提供参数类型
- std::bind 一个绑定函数
- 创建具有提升绑定/函数的菜单处理程序
- C++绑定函数以用作其他函数的参数
- C++ Boost::bind:指向绑定函数的指针只能用于调用该函数
- 如何指定可能接受 boost::绑定函数的 C++ 函数指针
- 指向绑定函数的指针只能用于调用该函数
- boost::spirit绑定函数,提供参数为spirit:qi::_val
- 套接字绑定函数编译错误
- 在绑定函数/使用lambdas测试消息传递代码时遇到麻烦
- 错误:指向绑定函数的指针只能用于调用该函数
- Windows套接字api绑定函数编译问题