【题目】static_cast在ATL当中的应用

一、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探讨

2、dynamic_cast的功能在VC 6.0中如何开启

3、MFC程序员的WTL教程(一)

4、WTL教程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值