1.求下列程序结果
#include"iostream" using namespace std; class A{ public: void funA(); }; class B{ public: void funB(); }; class C:public A,public B{ }; int main() { cout<<sizeof(C)<<endl; system("pause"); return 0; }
输出结果:1。 在没有虚函数的时候,类的继承关系不分配虚表,也就没有指向虚表的指针,至于为什么是1。
本来求
sizeof
应该是
0
。但当我们声明该类型的实例的时候,它必须在内存中占有一定的空间,否则无法使用这些实例。可以参考
http://blog.csdn.net/u010064842/article/details/9222005
第七题。
2.求下列程序输出结果
#include"iostream" using namespace std; class A{ public: A(int num=0){this->num = num;} virtual void fun1(){ cout<<"a="<<num<<endl;; cout<<"A::fun1"<<endl; } virtual void fun2(){ cout<<"A::fun2"<<endl; } private: int num; }; class B{ public: void funB(){}; }; class C:public A,public B{ }; int main() { typedef void(*FUN)(); A a(5); C c,c1; cout<<sizeof(A)<<endl; //1 cout<<"a虚表的位置"<<(int *)*(int *)&a<<endl; //2 cout<<"a中的num的值"<<*(int *)(((int *)&a)+1)<<endl; //3 cout<<endl; cout<<sizeof(C)<<endl; //4 cout<<"c虚表的位置"<<(int *)*(int *)&c<<endl; //5 cout<<"c1虚表的位置"<<(int *)*(int *)&c1<<endl; //6 FUN f = (FUN)*(int *)*(int *)&a; f(); //7 system("pause"); return 0; }
运行结果:
下面对结果分析:
//1:输出8,因为类中有虚函数,所以每个对象包含一个虚指针(4字节),再加上int类型(4字节)。
//2:(int *)*(int *)&a,(int *)&a取出a对象的地址并转换为int*指针,*(int *)&a取出第一个元素的值也就是虚指针的 值,(int *)*(int *)&a,(int *)&a 转换为(int *)打印。具体结构如下:
//3:分析跟2是一样的,详细如上面的图解。
//4:一个虚指针+num的存储空间。
//5:对象c的虚指针,同时也看到对象a和对象c的虚指针不是一个地方,即父类和子类的虚指针不一样。
//6:对象c1的虚指针,发现c和c1的指针是一样的,同类子对象虚指针是一样的。
//7: 调用虚函数,但是参数没传入,打印的是随机值。
注:(int *)&a,指针转换为相应的类型
3.下列程序程序输出结果
#include"iostream" using namespace std; class A{ public: virtual void fun1(){} }; class B{ public: virtual void fun2(){}; }; class C:public A,public B{ char ch; int num; }; class D:public A{ public:long long data; }; int main() { cout<<sizeof(A)<<endl; //1 cout<<sizeof(C)<<endl; //2 cout<<sizeof(D)<<endl; //3 D d; d.data = 25; cout<<*(long long *)((int *)&d+2)<<endl; //4 system("pause"); return 0; }
输出结果:
//1:A中含有一个虚指针,所以大小为4
//2:C继承自B、C,因为B和C都有虚函数,所以此时C中有两个虚指针,分别指向两个虚表。同时C还有char和int类型两个成员,这里同样需要考虑对界问题。且这个这个对界,从0开始对的。具体如下:
//3:D中只包含一个虚指针,但是含有long long类型元素(8个字节),这是也要考虑对界问题,具体如下:
//4:((int *)&d+2)将地址加到下面红色的地方,然后转换成long long*指针类型,再取出指针所指内容。验证了下面结构的正确性。
4.选择题
#include <stdio.h> int main(){ int s; scanf(“%d”,&s); while(s >0) { Switch(s) { case 1:printf(“%d”,s+5); case 2:printf(“%d”,s+4);break; case 3:printf(“%d”,s+3); default: printf(“%d”,s+2);break; } scanf(“%d”,&s); } }
这段代码输入1 2 3 4 5 0回车,输出结果是(A)
A、6566567
B、65665672
C、66667
D、666672
5、linux的cron后台常驻程序(daemon)用于(D)
A、负责文件在网络找的共享
B、管理打印子系统
C、跟踪管理系统信息和错误
D、管理系统日常任务的调度
说明:在Linux中,我们经常用到 cron 服务器来完成这项工作。cron服务器可以根据配置文件约定的时间来执行特定的作务。比如我们可以在配置文件中约定每天早上4点,对httpd 服务器重新启动,这就是一个计划任务;在Linux系统中,计划任务一般是由cron承担,我们可以把cron设置为开机时自动启动。cron启动后,它会读取它的所有配置文件(全局性配置文件/etc/crontab,以及每个用户的计划任务配置文件),然后cron会根据命令和执行时间来按时来调用度工作任务。
待续。。。。。。。