欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-08 20:23:58
...

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

#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关键字。

 

相关标签: 继承