关于pA,pB,pC的取值,下面的描述中正确的是:
A、pA,pB,pC的取值相同。
B、pC=pA+pB
C、pA,pB不相同
D、pC不等于pA也不等于pB
ClassC对象构建的时候,先调用A的构造函数,构造A,后调用B的构造函数构造B,最后调用C的构造函数构造C独有的数据。所以在内存中pA和pC都指向对象在内存中的起始位置,pA=pc。但是pB指向对象ClassC时,只是指向ClassB那一部分。所以,答案选择C。
6.参照1.5的代码,假设定义了 ClassA* pA2,下面正确的代码是:
A.pA2=static_cast<ClassA*>(pB);
B.void* pVoid=static_cast<void*>(pB);
pA2=static_cast<ClassA*>(pVoid);
C.pA2=pB;
D.pA2=static_cast<ClassA*>(static_cast<ClassC*>(pB));
这道题目涉及到两个知识点,一个是父类指针和子类指针之间转换的问题,一个是static_cast的使用。
下面讲解下这两个知识点,相信看完后上面的题目就很明确了。
(1)首先子类指针转换为父类指针是可以的,父类指针使用时简单的截断内存就可以。但是父类指针转换为子类指针是不安全的,因为在使用子类指针访问父类对象时可能超出对象的内存空间。
(2)static_cast的使用。
- 基类和子类之间转换:其中子类指针转换成父类指针是安全的;但父类指针转换成子类指针是不安全的。(基类 和子类之间的动态类型转换建 议用dynamic_cast)
- 基本数据类型转换。enum, struct, int, char, float等。static_cast不能进行无关类型(如非基类和子类)指 针之间的转换。
- 把空指针转换成目标类型的空指针。
- 把任何类型的表达式转换成void类型。
- static_cast不能去掉类型的const、volitale属性(用const_cast)。
借用一段实例代码如下:
int n = 6;
double d = static_castdouble>(n); // 基本类型转换
int *pn = &n;
double *d = static_castdouble *>(&n) //无关类型指针转换,编译错误
void *p = static_castvoid *>(pn); //任意类型转换成void类型
答案应该是CD。