- 求输出
#include
using namespace std;
class A
{
public:
virtual void print()
{
cout << “A::print()” << “\n”;
}
};
class B: public A
{
public: virtual void print()
{
cout << “B::print()” << “\n”;
}
};
class C: public A
{
public: virtual void print()
{
cout << “C::print()” << “\n”;
}
};
void print(A a)
{
a.print();
}
int main()
{
A a, *aa, *ab, *ac;
B b;
C c;
aa = &a;
ab = &b;
ac = &c;
a.print();
b.print();
c.print();
aa->print();
ab->print();
ac->print();
print(a);
print(b);
print©;
}
答案:A::print() B::print() C::print() A::print() B::print() C::print() A::print() A::print() A::print()
解析:
本题中,A是基类,B、C都是A的派生类,在基类与派生类中定义了同名的方法,这里使用了虚函数的定义。
A a, *aa, *ab, *ac;
B b;
C c;
aa = &a;
ab = &b;
ac = &c;
a.print();
b.print();
c.print();
这里,aa,ab,ac的指针类型都是A,而aa指向的对象a的对象类型是A,ab指向的对象b的对象类型是B,ac指向的对象c的对象类型是C。在这里,使用了virtual,程序将根据引用或者指针指向的对象的类型来选择方法。因此,a.print() 调用的是类A中的方法,b.print()调用的是类B中的方法,
c.print()调用的是类 C中的方法。
aa->print();
ab->print();
ac->print();
解释同上。
print(a);
print(b);
print©;
这里调用的就不是类的成员函数,而是一个类外的函数。函数声明的形参为A类型的,相当于强制类型转换,函数的输出是A::print()。向上强制转换。
如有定义:char str[20];,能将从键盘输入的字符串“How are you”保存到 str 数组的语句是()
scanf("%s", str);
str[] = getch();
gets(str);
str = gets();
正确答案;C
解析:
getch与getchar基本功能相同,差别是getch直接从键盘获取键值,不等待用户按回车,只要用户按一个键,getch就立刻返回, getch返回值是用户输入的ASCII码,出错返回-1.输入的字符不会回显在屏幕上.getch函数常用于程序调试中,在调试时,在关键位置显示有关的结果以待查看,然后用getch函数暂停程序运行,当按任意键后程序继续运行.
scanf :当遇到回车,空格和tab键会自动在字符串后面添加’\0’,但是回车,空格和tab键仍会留在输入的缓冲区中。即scanf遇到空格就退出
gets(): 以回车结束读取,使用’\0’结尾.回车符’\n’被舍弃没有遗留在缓冲区。可以用来输入带空格的字符串。即gets()遇到回车键再退出。
3.
请问:nLenA、nLenAObject、nLenB、nLenAObject、nLenC、nLenCObject的值分别为( )
答案:1,1,4,4,4,4
解析:C++11规定类的大小不为0,当类中仅有构造函数,析构函数或其他成员函数时,(也就是不包含虚函数和静态成员时)类的大小为1 。类的对象的大小也是1。因此nLenA、nLenAObject均为1.
类中如果声明了虚函数(无论多少个),在实例化对象的时候,编译器会在对象里自动安插一个虚函数表Vptr,一个对象会增加4个字节来存储此指针,这是实现多态的关键。因此,nLenB、nLenAObject的值均为4.
对于普通继承,派生类和基类共享虚函数指针,派生类对象的存储空间=基类存储空间+派生类特有的非static数据成员的空间,由于t_classA为空类,t_classB和t_classC共享虚函数指针,因此LenC和nLenCObject的值为4。
4.源程序:f.c 目标程序:f.obj 可执行程序: f.exe
5 已知 char c=48;int i=1,j=10;执行语句j=!(c>j)&&i++;则 i 和 j 的值分别是1和0。请问这句话是正确的吗?
答案:正确
解析: c>j true
!(C>j) false
&&的左边是false 因此,右边部分不再执行,j = 0,i=1;