C++ C++;-能以不同的方式执行功能吗?
在此代码中:C++ C++;-能以不同的方式执行功能吗?,c++,C++,在此代码中: void Window::oops() { printf("Window oops\n"); } void TextWindow::oops() { printf("TextWindow oops %d\n", cursorLocation); } TextWindow x; Window a; Window *b; TextWindow *c; a = x; a.oops(); // executes Window version b = &
void Window::oops() { printf("Window oops\n"); }
void TextWindow::oops() {
printf("TextWindow oops %d\n", cursorLocation);
}
TextWindow x;
Window a;
Window *b;
TextWindow *c;
a = x; a.oops(); // executes Window version
b = &x; b->oops(); // executes TextWindow or Window version
c = &x; c->oops(); // executes TextWindow version
b=&x;b->oops()代码>将执行文本窗口或窗口版本?如何决定 如果oops()
是虚拟的,则b->oops()
调用将使用TextWindow
版本。如果不是,它将使用窗口
版本。如果oops()
是虚拟的,b->oops()
调用将使用文本窗口
版本。如果不是,它将使用窗口
版本
a = x; a.oops(); // executes Window version
这会导致对象切片。请参阅此wiki条目:
使用此函数,可以多态地调用虚拟函数。它将调用文本窗口版本,而不是窗口版本
c = &x; c->oops(); // executes TextWindow version
它只是使用与对象的动态类型相同的指针调用虚函数,在本例中,如果TextWindow
,则调用虚函数
这会导致对象切片。请参阅此wiki条目:
使用此函数,可以多态地调用虚拟函数。它将调用文本窗口版本,而不是窗口版本
c = &x; c->oops(); // executes TextWindow version
它只是使用与对象的动态类型相同的指针调用虚函数,在这种情况下,如果TextWindow
,它是基本的:
b作为指向窗口的指针,它可以指向窗口对象或从窗口继承的类型的对象。然后,继承的类型可以重新实现oops()函数(如果在窗口定义中指定了oops())
允许这样,C++编译器将添加附加信息来路由对象数据中的函数调用,几乎总是以.< /p>的形式进行。
这允许您操作一组窗口,调用基本成员函数,而不必担心对象最终会做什么。然后,该对象可以针对其特定的子类型以特定的方式实现函数
请参阅wikipedia页面中的简单示例:它是基本的:
b作为指向窗口的指针,它可以指向窗口对象或从窗口继承的类型的对象。然后,继承的类型可以重新实现oops()函数(如果在窗口定义中指定了oops())
允许这样,C++编译器将添加附加信息来路由对象数据中的函数调用,几乎总是以.< /p>的形式进行。
这允许您操作一组窗口,调用基本成员函数,而不必担心对象最终会做什么。然后,该对象可以针对其特定的子类型以特定的方式实现函数
请参阅维基百科页面中的简单示例:虽然没有特别说明,但我假设TextWindow
是(直接或间接)从Window
派生出来的
在这种情况下,基本问题是oops()
是否为虚拟成员函数
如果oops()
是虚拟的,那么通过指针或引用的调用基于动态类型——指针/引用实际引用的对象的类型
如果oops()
不是虚拟的,那么通过指针或引用进行的调用基于静态类型——指针定义指向的对象类型,而不管它实际指向的对象类型
struct Window {
void oops() { std::cout << "Window::oops()\n"; }
virtual void oops2() { std::cout << "Window::oops2()\n"; }
};
struct TextWindow : Window {
void oops() { std::cout << "TextWindow::oops()\n"; }
virtual void oops2() { std::cout << "TextWindow::oops2()\n"; }
};
int main() {
Window w;
w.oops(); // Both of these print "Window::...".
w.oops2();
TextWindow tw;
tw.oops(); // Both of these print "TextWindow::...".
tw.oops2();
Window &w2 = tw;
w2.oops(); // oops() is not virtual, and we're using a reference to a Window,
// so this invokes Window::oops().
w2.oops2(); // oops2() is virtual, so even though w2 is a reference to a
// Window, this invokes TextWindow::oops2(), because the reference
// refers to the object tw, which is a TextWindow.
return 0;
}
结构窗口{code>
void oops(){std::cout虽然没有特别说明,但我假设TextWindow
是从Window
直接或间接派生出来的
在这种情况下,基本问题是oops()
是否为虚拟成员函数
如果oops()
是虚拟的,那么通过指针或引用的调用基于动态类型——指针/引用实际引用的对象的类型
如果oops()
不是虚拟的,那么通过指针或引用进行的调用基于静态类型——指针定义指向的对象类型,而不管它实际指向的对象类型
struct Window {
void oops() { std::cout << "Window::oops()\n"; }
virtual void oops2() { std::cout << "Window::oops2()\n"; }
};
struct TextWindow : Window {
void oops() { std::cout << "TextWindow::oops()\n"; }
virtual void oops2() { std::cout << "TextWindow::oops2()\n"; }
};
int main() {
Window w;
w.oops(); // Both of these print "Window::...".
w.oops2();
TextWindow tw;
tw.oops(); // Both of these print "TextWindow::...".
tw.oops2();
Window &w2 = tw;
w2.oops(); // oops() is not virtual, and we're using a reference to a Window,
// so this invokes Window::oops().
w2.oops2(); // oops2() is virtual, so even though w2 is a reference to a
// Window, this invokes TextWindow::oops2(), because the reference
// refers to the object tw, which is a TextWindow.
return 0;
}
结构窗口{code>
void oops(){std::cout-1表示,如果不是,它将使用窗口版本
,因为它将调用文本窗口
版本。@Nawaz:不会。如果函数不是虚拟的,它将使用窗口版本,因为b类型为Window*-1表示,如果不是,它将使用窗口版本
,因为它将调用文本indow
version.@Nawaz:不,它不会。如果函数不是虚拟的,它将使用窗口版本,因为b的类型是Window*b->oops()
仅当oops()时才会调用TextWindow版本
是虚拟的,我们无法判断它是否来自问题中的代码段。我没有看到oops
声明为virtual
。无法从发布的代码段OP中确定类是否是多态的。b->oops()
仅当oops()时才会调用TextWindow版本
是虚拟的,我们无法判断它是否来自问题中的代码段。我没有看到oops
声明为virtual
。无法从发布的代码段确定类是否是多态的。