子类对象访问基类的非虚成员函数
程序员文章站
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关键字。
上一篇: Example 3-4.
推荐阅读
-
Java、C++中子类对父类函数覆盖的可访问性缩小的区别介绍
-
Java、C++中子类对父类函数覆盖的可访问性缩小的区别介绍
-
子类可以继承父类的一切方法,成员变量,甚至是私有的,但是却不能够访问这些私有的成员变量和方法
-
c/c++ 继承与多态 子类隐藏父类的同名非虚函数
-
C++简单的子类继承父类访问父类的成员函数和成员变量
-
c++中基类和子类的成员变量同名,成员函数也同名
-
公有继承中派生类Student对基类Person成员的访问
-
C++友元函数访问类的私有成员(代码实例)
-
子类可以继承父类的一切方法,成员变量,甚至是私有的,但是却不能够访问这些私有的成员变量和方法
-
公有继承中派生类Student对基类Person成员的访问 代码参考