众所周知,子类对象可以强制转换为父类或者赋值给父类,按父类来引用子类一般是正确的,这种转换叫做向上强制类型转换。如果说这种转换或者是赋值是直接在对象上进行操作的,那么会发生切割问题,原因是父类对象没有子类自己定义的附加功能。例:
class Person
{
public:
Person();
void someMethod();
private:
string name;
};
class Student : public Person
{
public:
Student();
void someOtherMethod();
};
int main()
{
Person ps;
Student st;
ps = st;//发生切割
return 0;
}
如果使用指针或者引用,那么就不会发生切割。
int main()
{
Student st;
Person& ps = st;
return 0;
}
故在进行向上强制类型转换的时候,要使用指向父类的指针或者引用来避免切割问题。
从父类到子类也是可以转换的,这种转换称为向下类型转换。这也是个很烦人的问题,原因是没有办法保证对象真正属于该子类。
可以写一个函数来实现:
void pscastst(Person* ps)
{
Student* st = static_cast<Student*>(ps);
//proceed to access Student methods on Person
} 可是这个很容易让人产生意识上的错误,认为ps就是指向Student对象的指针,所以在进行向下强制类型转换时,要使用dynamic_cast,它使用该类型对象的内置知识来防止无意义的类型转换,所以上面的函数可改进为:
void pscastst(Person* ps)
{
Student* st = dynamic_cast<Student*>(ps);
if(st != NULL)
//proceed to access Student methods on Person
}
参考资料: C++高级编程