van*_*d69 5 c++ polymorphism virtual-functions
我已经阅读了C ++中的虚函数,并了解了它们如何通过基类的指针为程序员提供对派生类的成员函数的访问。(又名多态性)。
困扰我的问题是:
。
#include <iostream>
using namespace std;
class B
{
public:
void virtual display()
{ cout<<"Inside base class.\n"; }
};
class D : public B
{
public:
void display()
{ cout<<"Inside derived class.\n"; }
};
int main()
{
B *b;
D d;
//Line-22 b->display(); Why can't 'b' call it's own display()?
b = &d;
b->display();
system("pause");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
内部派生类。
b是指针而不是对象。最初它没有指向任何东西(因此间接通过它是一个错误);after b = &d,它指向一个D对象,因此用它调用虚函数会调用 的Doverride 。
定义了虚拟调度机制,以便根据指针指向的实际对象的类型而不是指针的声明类型来选择函数。因此,如果它指向一个B对象,那么它会调用B::display; 这里,它指向一个D对象,因此它调用D::display.
如果最终必须声明为虚函数,为什么要在基类中声明一个同名的函数呢?
它需要在基类中声明,以便在使用指向基类的指针时,编译器知道它的存在。通过指针调用函数是否会调用基类版本,或者被派生类重写的版本,取决于对象的类型。
在下面的代码中,如果
virtual display()使用基类指针调用(第 22 行),则会显示错误。
那是因为它没有指向任何东西,所以使用它是一个错误。如果它指向一个B对象,那么它将调用 中声明的函数B。
B b_obj;
b = &b_obj;
b->display(); // "Inside base class"
Run Code Online (Sandbox Code Playgroud)
为什么 C++ 中的虚函数如此严格,不能被基类指针调用?
他们不是; 这是称呼他们的通常方式。但指针必须指向有效的对象才能使虚拟调度工作。
| 归档时间: |
|
| 查看次数: |
1058 次 |
| 最近记录: |