首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果基类有/没有额外的虚拟方法,为什么非虚拟方法(从派生类调用时)的行为会改变?

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

Stack Overflow用户
提问于 2016-11-29 17:52:07
回答 1查看 152关注 0票数 2

给出了以下代码:

代码语言:javascript
复制
#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;
}

我预计产出如下:

代码语言:javascript
复制
class A
class B

但产出实际上是:

代码语言:javascript
复制
class B
class B

如果我从第二个函数中删除虚拟说明符,输出将如预期的那样:

代码语言:javascript
复制
class A
class A

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

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

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

由于成员函数print1()没有虚拟说明符,所以结果不应该总是“A类”,而不管在哪里调用它?为何不是这样呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-29 18:21:08

当typeid应用于多态类类型(这是“至少有一个虚拟函数的类”的花哨名称)时,总是返回动态类型,使用的上下文并不重要。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40872510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档