c++继承的一个小疑点
c++继承的一个小问题
1.有如下程序段:
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)
A) 22 B) 11 C) 12 D) 21
2.以下描述错误的是:(C)
A) 函数的行参在函数未调用时不分配存储空间
B) 若函数的定义出现在主函数之前,则可以不必再说明
C) 若一个函数没有return语句,则什么值都不返回
D) 一般来说,函数的行参和实参的类型应该一致
请解释这两个题目的答案为什么会如此,第4题为什么不选A,第5题A,B,D的描叙是正确的,但C我不太清楚
------解决方案--------------------
1)
b.print(); 打印 1
printf(“%d”,b._a); 打印2
合起来 12
2)
1.有如下程序段:
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)
A) 22 B) 11 C) 12 D) 21
2.以下描述错误的是:(C)
A) 函数的行参在函数未调用时不分配存储空间
B) 若函数的定义出现在主函数之前,则可以不必再说明
C) 若一个函数没有return语句,则什么值都不返回
D) 一般来说,函数的行参和实参的类型应该一致
请解释这两个题目的答案为什么会如此,第4题为什么不选A,第5题A,B,D的描叙是正确的,但C我不太清楚
------解决方案--------------------
1)
b.print(); 打印 1
printf(“%d”,b._a); 打印2
合起来 12
2)
- C/C++ code
int fun() { __asm { mov eax, 100 } } int main() { int a = 100; a = fun(); cout<<a<<endl; return 0; }
------解决方案--------------------
对于1,在派生类中,新定义的同名数据成员只是在派生类的新增成员函数中或在类外部代码访问时才会屏蔽基类的数据成员,而从基类继承来的成员函数操作的仍是基类中的数据成员,就是说,派生类中存在两个_a,要想在派生类新增的成员函数中操作基类的数据成员
_a,则要借助域名解析来完成
对于2,就是个规定问题
------解决方案--------------------
1.
在这个函数中:
void print()
{
printf(“%d”, _a);
}
void print(这里隐含有个this指针,因为他是成员函数),而b.print里传的是
b对象中基类部分的指针,故this是基类,也就输出基类的_a 了.
这样是不是很好理解啊.
2.
一般函数的返回值都是放到eax寄存器中(32位).如星羽的回答.