首页 > 代码库 > 腾讯2011一道父类指针和子类指针转化的题目

腾讯2011一道父类指针和子类指针转化的题目

class ClassA
{
public:
        virtual ~ClassA(){}
        virtual void FunctionA(){}
};

class ClassB
{
public:
        virtual void FunctionB(){}
};

class ClassC :public ClassA , public ClassB {

};
关于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。


腾讯2011一道父类指针和子类指针转化的题目