以下实例来自百度百科
//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,如果基础类和衍生类定义了相同名称的成员函数,那么通过对象指针调用成员函数时,
到底调用那个函数要根据指针的原型来确定,而不是根据指针实际指向的对象类型确定。
新闻热点
疑难解答