我已经阅读了C中的虚函数,并了解它们如何使用基类的指针为程序员提供对派生类的成员函数的访问. (又名多态性).
困扰我的问题是:
>为什么在基类中声明一个具有相同名称的函数,如果最终必须将其声明为虚拟? (注意:我需要关于虚函数的多态性方面的答案)
>在下面的代码中,如果使用基类指针(第22行)调用’virtual display()’,则会显示错误.为什么C中的虚函数如此严格w.r.t.没有被基类指针调用?
.
#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;
}
输出:
里面的派生类.
最佳答案 b是指针而不是对象.最初它没有指向任何东西(因此通过它是间接的错误);在b =& d之后,它指向一个D对象,因此使用它来调用虚函数将调用D的覆盖.
定义虚拟调度机制,以便根据指针指向的实际对象的类型选择函数,而不是指定的声明类型.所以,如果它指向一个B对象,那么它将调用B :: display;在这里,它指向一个D对象,因此它调用D :: display.
Why declare a function with a same name in the base class, if in the end it has to be declared virtual?
它需要在基类中声明,以便在使用指向基类的指针时,编译器知道它存在.是否通过指针调用函数将调用基类版本,或者由派生类重写的版本取决于对象的类型.
In the code below, if
virtual display()
is called with a base class pointer (Line 22), it shows an error.
那是因为它没有指向任何东西,所以使用它是一个错误.如果它指向一个B对象,那么它将调用在B中声明的函数.
B b_obj;
b = &b_obj;
b->display(); // "Inside base class"
Why are virtual functions in C++ so rigid w.r.t. not getting called by base class pointers?
他们不是;这是调用它们的通常方式.但是指针必须指向一个有效的对象才能使虚拟调度工作.