gpt4 book ai didi

c++ - 如果基类有/没有额外的虚拟方法,为什么非虚拟方法的行为(当从派生类调用时)会改变?

转载 作者:搜寻专家 更新时间:2023-10-31 01:33:44 24 4
gpt4 key购买 nike

给出如下代码:

#include <iostream>
#include <typeinfo>

using namespace std;

class A
{
public:
void print1()
{
cout << typeid(*this).name() << endl;
}

virtual void print2()
{
cout << typeid(*this).name() << endl;
}
};

class B : public A {};

int main()
{
B b;

b.print1();
b.print2();

return 0;
}

我期望输出是:

class A
class B

但输出实际上是:

class B
class B

如果我从第二个函数中删除虚拟说明符,则输出符合预期:

class A
class A

据我所知,虚拟成员函数允许动态绑定(bind),因此可以动态确定对象的类型。非虚拟成员函数不允许动态绑定(bind),对吗?

上面代码中的成员函数 print2() 是虚函数,所以当从类 B 调用时,typeid(*this).name() 返回“类 B”而不是“类 A”。

成员函数 print1() 不是虚拟的,但在从类 B 调用时仍然返回“类 B”,只是因为类 A 中有另一个成员函数是虚拟的,在这种情况下是 print2()。

既然成员函数 print1() 没有虚拟说明符,那么结果不应该总是“A 类”,无论从哪里调用它吗?为什么不是这样?

最佳答案

typeid,当应用于多态类类型(这是“具有至少一个虚函数的类”的奇特名称)时,总是返回动态类型。使用的上下文不没关系。

换句话说,在这种情况下,typeid 本身的行为就像一个虚函数。

关于c++ - 如果基类有/没有额外的虚拟方法,为什么非虚拟方法的行为(当从派生类调用时)会改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40872510/

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