练习19.6
编写一条表达式将Query_base指针动态转换为AndQuery指针(参见15.9.1节,第564页)。分别使用AndQuery的对象以及其他类型的对象测试转换是否有效。打印一条表示类型转换是否成功的信息,确保实际输出的结果与期望一致。
解答:
Query那些类比较麻烦,其实这里也就是要看转换的继承关系,并确定是否能转换成正确的类型。
这里使用了19.2.1中19.3练习的继承体系。
int main(){
A *pa = new A;
try{
auto *pb = dynamic_cast<B*>(pa);
cout << typeid(pb).name() << endl;
if (typeid(pb) == typeid(B*)){
cout << "convert correct" << endl;
}
}
catch (bad_cast& e){
cout << e.what() << endl;
}
}
练习19.7
编写与上一个练习类似的转换,这一次将Query_base对象转换为AndQuery的引用。重复上面的测试过程,确保转换能正常工作。
解答:
int main(){
B &b = B();
try{
auto *pb = dynamic_cast<B*>(&b);
cout << typeid(pb).name() << endl;
if (typeid(pb) == typeid(B*)){
cout << "convert correct" << endl;
}
}
catch (bad_cast& e){
cout << e.what() << endl;
}
}
练习19.8
编写一条typeid表达式检查两个Query_base对象是否指向同一种类型。在检查该类型是否是AndQuery。
解答:
int main(){
A a1 = B();
A a2 = C();
if (typeid(a1) == typeid(a2)){
cout << "point same type" << endl;
}
}
这里只要对象的类型相同,那么他们肯定指向同一种类型。