子类对象访问基类的非虚成员函数

 直接看牛客网上面的一段代码:

#include "stdio.h"
 
class A
{
public:
    int _a;
    A()
    {
        _a = 1;
    }
    void print()
    {
        printf("%d", _a);
    }
};
class B: public A
{
public:
    int _a;
    B()
    {
        _a = 2;
    }
};
int main()
{
    B b;
    b.print();
    printf("%d", b._a);
}

 我们知道在虚函数通过虚表来进行实现,最终完成动态绑定,实现多态,关于这个虚表不是我今天要讨论的关键,看看这个非虚函数的调用过程到低是怎么回事。在C++ primer中关于类的作用域中有讲到,①子类对象去调用print()时,首先在子类对象中查找,没有找到名字print()。②于是早父类中去找,找到了这个函数,最终解析为父类的print()函数。
        这个成员函数没有被声明为虚函数,其解析的过程发生在编译时而非运行时,因此这个函数无论作用域父类对象还是子类对象,其行为都是一样的,在这个继承层次关系中只有一个print()函数,因此不存在调用print()函数时到底执行那个版本的问题。
        那要是子类定了print()函数呢?那将打印22。这个地方又设计一个知识点,定义了这个函数之后,是覆盖了还是屏蔽了呢?很明显是被屏蔽了,因为覆盖有一点很重要的要求,有virtual关键字。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值