首页 > 学院 > 开发设计 > 正文

实例:父类指针操作子类对象,以及dynamic_cast和static_cast的比较

2019-11-06 07:21:47
字体:
来源:转载
供稿:网友
以下实例来自百度百科//TestCast.cpp//#include"stdafx.h"#include<iostream>using namespace std;class Base{public:virtual void f(){cout<<"Base::f"<<endl;}void f1(){cout<<"Base::f1"<<endl;}PRivate:double x;double y;};classDerived:publicBase{public:virtual void f(){cout<<"Derived::f"<<endl;}virtual void k(){cout<<"Derived::k"<<endl;}private:double z;};class Base1{public:virtual void g(){cout<<"Base1::g"<<endl;}void g1(){cout<<"Base1::g1"<<endl;}};class Derived1:public Base,public Base1{public:virtual void f(){cout<<"Derived1::f"<<endl;}virtual void h(){cout<<"Derived1::h"<<endl;}};void Test1(){//对于单继承,//如果pD真的指向Derived,用dynamic_cast和static_cast效果相同Base*pD=new Derived;Derived*pD1=dynamic_cast<Derived*>(pD);pD1->f();pD1->k();pD1->f1();Derived*pD2=static_cast<Derived*>(pD);pD2->f();pD2->k();pD2->f1();//但是如果pB不是真的指向Derived,则用dynamic_cast则返回NULL,//能够更早的禁止error的发生,如果用static_cast虽然返回的不为//NULL,但是运行时可能抛出exception。/**/////Errorcode//Base*pB=new Base();//Derived*pD3=static_cast<Derived*>(pB);//pD3->f();//pD3->k();//pD3->f1();//Derived*pD4=dynamic_cast<Derived*>(pB);//pD4->f();//pD4->k();//pD4->f1();}void Test2(){//对于多重继承,//如果pD真的指向的是Derived1,使用dynamic_cast和static_cast//都可以转化为Derived1,但是如果要转化为Base的兄弟类Base1,//必须使用dynamic_cast,使用static_cast不能编译。Base*pD=new Derived1;Derived1*pD1=dynamic_cast<Derived1*>(pD);pD1->f();pD1->h();pD1->f1();Base1*pB1=dynamic_cast<Base1*>(pD);pB1->g();Derived1*pD2=static_cast<Derived1*>(pD);pD2->f();pD1->h();pD2->f1();/**/////errorcannotcompiler//Base1*pB2=static_cast<Base1*>(pD);//pB2->g();//当然对于pB不是真的指向Derived1,想要转化为Derived1或Base的//兄弟类Base1,情况与Test1中的error情况相同。}int _tmain(int argc,_TCHAR*argv[]){Test1();Test2();return 0 ;}父类子类指针函数调用注意事项1,如果以一个基础类指针指向一个衍生类对象(派生类对象),那么经由该指针只能访问基础类定义的函数(静态联翩)2,如果以一个衍生类指针指向一个基础类对象,必须先做强制转型动作(explicit cast),这种做法很危险,也不符合生活习惯,在程序设计上也会带来困扰。(不建议)3,如果基础类和衍生类定义了相同名称的成员函数,那么通过对象指针调用成员函数时,到底调用那个函数要根据指针的原型来确定,而不是根据指针实际指向的对象类型确定。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表