为什么“基类对象”不能调用它自己的虚函数?C ++

van*_*d69 5 c++ polymorphism virtual-functions

我已经阅读了C ++中的虚函数,并了解了它们如何通过基类的指针为程序员提供对派生类的成员函数的访问。(又名多态性)。

困扰我的问题是:

  1. 如果最后必须将其声明为虚函数,为什么还要在基类中声明一个具有相同名称的函数?(注意:关于虚拟函数的多态性,我需要答案)
  2. 在下面的代码中,如果使用基类指针(第22行)调用了“ virtual display()”,则会显示错误。为什么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)

输出:

内部派生类。

Mik*_*our 3

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++ 中的虚函数如此严格,不能被基类指针调用?

他们不是; 这是称呼他们的通常方式。但指针必须指向有效的对象才能使虚拟调度工作。

  • 感谢您用一行文字解释了“虚拟调度机制”。 (2认同)