dynamic_const的语法形式如下:
dynamic_const<T> (expression)
dynamic_const的用途是将expression的类型转换为T。
在上面的语法形式中,T代表一个类型,它必须是以下三种类型之一:
类的指针类型
类的引用类型
void*
那么相应的,expression也必须是类的指针或者是类的引用。注意不能是void*,否则会出现编译错误。
从上面的描述可知,dynamic_const操作的对象都是关乎类的,它不能作用在C++中的内置对象(比如int)上。
而且对类还有一个特殊的要求,就是类必须要有虚函数。如果T所相关的类没有虚函数,则会出现编译错误。
dynamic_const的返回值有两种:
1 返回expression的值。在以下几种情况下会返回这个值。
①如果expression指向的对象的类型是A,并且T关乎的那个类是A的基类。
②T为void*
③如果expression指向的对象确实能转换为类型T。(比如确实指向一个T类型的对象)
2 返回NULL。
不满足上述1的情况就会返回NULL。
下面是一个dynamic_const的例子:
#include <iostream>
using namespace std;
class A
{
private:
int a;
public:
virtual void print(){
cout<<"A class"<<endl;
}
};
class B : public A
{
private:
int b;
public:
virtual void print(){
cout<<"B class"<<endl;
}
};
class C : public A
{
private:
int c;
public:
virtual void print(){
cout<<"C class"<<endl;
}
};
int main(){
A* pa = new B();
B * pb = new B();
A * pb2 = dynamic_cast<A*>(pb);
C * pb3 = dynamic_cast<C*>(pb);
B *pa2 = dynamic_cast<B*>(pa);//OK
void * pb4 = dynamic_cast<void*>(pb);
if(pb2){//不为NULL
cout<<"pb2 is not null"<<endl;
pb2->print();
}
if(pb3){ //为NULL
pb3->print();
cout<<"pb3 is not null"<<endl;
}
if(pb4){ //不为NULL
cout<<"pb4 is not null"<<endl;
}
}