条款27:尽量少做转型操作

来源:互联网 发布:好听的淘宝优惠群取名 编辑:程序博客网 时间:2024/06/10 03:34

特别说明dynamic_cast和static_cast两种

1、static_cast

#include <iostream>using namespace std;class Base{public:Base(int i = 0):bVal(i){cout<<"基类构造函数"<<endl;}virtual void say(){cout<<++bVal<<endl;}int bVal;};class Drived:public Base{public:Drived(int i = 10, int j = 5):Base(i),dVal(j){cout<<"派生类构造函数"<<endl;}void say(){cout<<"基类值为:"<<endl;//错误做法  这里仅是对*this拷贝一个base部分的副本然后调用say(),//他的操作不会影响到*this的内容 static_cast<Base>(*this).say();    //case1//正确做法//Base::say();            //case2      cout<<"派生类值为:"<<endl;cout<<dVal<<endl;}private:int dVal;};int main(){Drived d;d.say();cout<<d.bVal<<endl;return 0;}

使用case1的运行结果是

基类构造函数
派生类构造函数
基类值为:
11
派生类值为:
5
10
使用case2的运行结果是

基类构造函数
派生类构造函数
基类值为:
11
派生类值为:
5
11

2、dynamic_cast

#include <iostream>using namespace std;class Base{public:Base(int i = 0):bVal(i){cout<<"基类构造函数"<<endl;}//virtual void say(){}           //case1virtual void fun(){}             //case2private:int bVal;};class Drived:public Base{public:Drived(int i = 10, int j = 5):Base(i),dVal(j){cout<<"派生类构造函数"<<endl;}void say(){cout<<"派生函数"<<endl;}private:int dVal;};int main(){Base *pd = new Drived;//pd->say();                                  //case1Drived* pd1 = dynamic_cast<Drived*>(pd);    //case2pd1->say();                                 //case2return 0;}

使用case1时基类必须有虚函数且与继承类函数同名。

使用case2时基类必须有虚函数,任何虚函数都行。

还有一种是通过Vector和std::trl::shared_ptr实现的,Effective C++中也说了,但是不是很了解怎么用,blog http://blog.csdn.net/thefutureisour/article/details/7968534也说明了,可以参考。



0 0
原创粉丝点击