C++程序的设计原则是尽可能的尽可能的避免的类型的转换,因为有时类型转换往往会带来一些编译上的错误,而有些虽然不会带来错误单数会导致逻辑上的错误,但是却很难发现。
C++语言中提供了四种类型转换方式:
为什么应该极力的避免使用类型转换,因为有时我们会收到意向不到的结果。
上图的代码中,我们定义两个类,我们希望在派生类的成员中调用基类成员的onResize(),因此我们在派生类的相应的虚函数中将对象本身转换成为基类,然后调用基类的相应的函数,以下的这一步操作。
这似乎看起来很美好,但是实际上,这将会带来一个意向不到的结果,而这个结果往往编译器将会没办法检查出来,因此导致程序的逻辑在某处发生 错误,上述的静态类型转换后执行的函数并不是派生类对象中的基类成员,而是类型转换时临时生成的一个对象,也就是,这实际上的父类的并没有执行该函数,而执行该函数将是一个临时变量,而这个临时变量必将会使用到。这样实际上你将会得到的一个错误结果,而编译器并不会报错。
那么针对上述的情况我们一般的做法一般是显示的调用其基类函数,如下:
这样我们就正确的调用了相应对象的基类函数了。
另一种情况我们想要使用类型转换就是当我们用一个基类的指针的对象指向派生时,当我们想要使用派生中的函数时,我们想要采用静态类型转换来实现。但是实际上我们是可以避免这种情况的。
上述的函数中我们采用静态类型的方式来进行转换,以方便调用派生类的函数,但是我们可以通过在基类中使用虚函数的方式来避免这种转换,也就是我们在基类中定义这样一个虚函数,但是我们在虚函数中并不会真正的去实现功能,而是在派生类中去重载这样的接口,然后可以不加以区分的方式利用基类指针来调用该基函数。
对于类型转换我们应该极力的去避免,但是完全避免是不可能的,优良的代码中应该极力的去避免类型转换。