gpt4 book ai didi

c++ - 为什么 'Base Class object' 不能调用它自己的虚函数? C++

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:44:06 24 4
gpt4 key购买 nike

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

一直困扰我的问题是:

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

定义了虚拟调度机制,以便根据指针指向的实际对象的类型而不是指针的声明类型来选择函数。因此,如果它指向一个 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?

他们不是;这是通常的称呼方式。但是指针必须指向一个有效的对象,虚拟分派(dispatch)才能工作。

关于c++ - 为什么 'Base Class object' 不能调用它自己的虚函数? C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25624270/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com