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.
假定有类AB,有相应的构造函数定义,能正确执行
AB a(4),b(5),c[3],*p[2]={&a,&b};
语句,请问执行完此语句后共调用该类的构造函数次数为___
答案:5
解释:
只有给对象分配内存才调用构造函数 AB a(4) 定义对象a, 调用了带一个参数的构造
AB b(5)跟上面的性质类似, 调用了带一个参数的构造
AB c[3] 跟上面的性质类似, 定义对象数组,调用无参构造3次
AB *p这至是一个指针,没有指向任何空间,更么有分配内存,不会调构造