1.
#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);
while (1);
return 0;
}请问输出是什么?
答案:12
原因:
子类存在与父类同名的成员变量,则子类屏蔽父类的同名成员变量,但给孩子类中没有定义print函数,所以会按照就近原则去寻找父类中是否有print函数。恰好父类中有这个函数,于是调用父类的print函数b.print(),而这个函数会调用父类的a变量。
若子类b中也有print函数,请问结果如何?
即题目改成下面的程序:
#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;
}
void print()
{
printf("%d", _a);
}
};
int main()
{
B b;
b.print();
printf("%d", b._a);
while (1);
return 0;
}答案:22,
因为子类中已有print,不需要到父类中寻找。
2.

本文探讨了C++中的类与继承概念。在一道笔试题中,解释了子类如何屏蔽父类的同名成员变量,并详细分析了在不同情况下构造函数的调用顺序和规则。通过具体的例子,展示了当子类不存在特定函数时,会查找父类的函数进行调用,以及如何判断构造函数的执行情况。
最低0.47元/天 解锁文章
2349

被折叠的 条评论
为什么被折叠?



