一、dynamic_cast的应用
class Base
{
public:
virtual void OutPut1(){ cout<<"Base"<<endl; }
};
class Derived1:public Base
{
public:
void OutPut1(){ cout<<"De1"<<endl; }
};
class Derived2:public Base
{
public:
void OutPut1(){ cout<<"De2"<<endl; }
//新增加的功能
void Output2(){ cout<<"新增功能"<<endl; }
};
void test(Base* myBase)
{
Derived2* myDerive = dynamic_cast<Derived2*>(myBase);
//Derived2* myDerive =(Derived2*)myBase; //也可以用这个来转换
if(myDerive)
myDerive->Output2(); //如果确实是Derived2,则转换成了它的对象,否则赋值为NULL
else
myBase->OutPut1();//cout<<"it's not Derived2";
}
int main(int argc, char* argv[])
{
//Base* myBase = new Derived2;
Base* myBase = new Derived1;
test(myBase);
printf("Hello World!\n");
return 0;
}
【点评】static_cast、dynamic_cast是用来强制转换数据类型的,由编译器来生成结果,而不是调用某函数。这样的话,起到了很好的扩展作用,即可以添加新的功能。
二、static_cast实现C++多态
template <class T>
class B1
{
public:
void test()//这个也是编译器预先读取,并未生成代码
{
T* pT = static_cast<T*>(this);
pT->OutPut1();
}
protected:
void OutPut1(){ cout<<"B1"<<endl; }
};
class D1:public B1<D1>
{
};
class D2:public B1<D2>
{
public:
void OutPut1(){ cout<<"D2"<<endl; }
};
int main(int argc, char* argv[])
{
D1 d1;
D2 d2;
d1.test();//直接调用到继承的B1::test()
d2.test();//调用到D2::test(),编译器已经确定
printf("Hello World!\n");
return 0;
}
【点评】通过test的预编译,实现C++多态,生成的代码量更少。
参考:1、static_cast,dynamic_cast,const_cast探讨
4、WTL教程