effective c++ 尽量少做转型动作(2)

时间:2022-04-22 05:35:43

C风格的转型动作
(T)expression //将expression转型为T
函数风格的转型动作
T(expression)//将expression转型为T

旧式转型依旧合法,但是新式转型较受欢迎
1.容易在代码中识别出来,无论是人眼还是grep等工具
2.各转型目标愈窄化,编译器愈可能诊断出错误的运用,比如只有const_cast能去掉常量性

class Base
{
public:
void show(){cout << "base" << endl;}
};
class Base2
{
public:
void show(){cout << "base2" << endl;}
};
class Derived:public Base,public Base2
{
public:
void show(){cout << "derived" << endl;}
};
Derived d;
Base* pb = &d;
Base2* pb2 = &d;
Derived *pd = &d;
//单一对象(例如一个类型为Derived的对象)可能拥有一个以上的地址
//以Base*指向它时的地址和以Derived*指向它时的地址
//虽然我的电脑没有尝试出来
//但是依旧,应该避免做出“对象在C++中如何布局”的假设
//例如,将对象地址转型为char*指针然后在他们身上进行指针算术
//几乎总是导致无定义行为
class Base
{
public:
Base():cur(1){}
virtual void onResize()
{
cur = 10;
}
int cur;
};
class Derived:public Base
{
public:
virtual void onResize()
{
static_cast<Base>(*this).onResize();
cout << Base::cur << " cur " << endl;
//显示cur为1(初始值)
//因为调用的不是当前对象身上的函数
//而是转型动作所建立的一个*this对象之base class成分
//的暂时副本身上的onResize
}
};
int main()
{
Derived d;
d.onResize();
}

effective c++ 尽量少做转型动作(2)

class Derived:public Base
{
public:
virtual void onResize()
{
Base::onResize();
cout << Base::cur << " cur " << endl;
//这样就对了
}
};

dynamic_cast主要用来执行“安全向下转型”,也就是用于决定某对象是否归属继承体系中的某个类型。。。
但是可能耗费重大运行成本的转型动作,很多时候可以用virtual代替

优良的C++代码很少使用转型,我们应该尽量隔离转型动作,通常是把它隐藏在某个函数内。函数的接口会保护调用者不受函数内部任何肮脏龌龊的动作影响!