理解C++ dynamic_cast
?class Shape {
??? public: virtual ~Shape();
??? virtual void draw() const = 0;
};
class Rollable {
??? public: virtual ~Rollable();
??? virtual void roll() = 0;
};
class Circle : public Shape, public Rollable {
??? void draw() const;
??? void roll();
};
class Square : public Shape {
??? void draw() const;
};
?
//横向转型失败
Shape *pShape1 = new Square();
Rollable *pRollable1 = dynamic_cast<Rollable*>(pShape2);//pRollable为NULL
//横向转型成功
Shape *pShape2 = new Circle();
Rollable *pRollable2 = dynamic_cast<Rollable*>(pShape2);//pRollable不为NULL
?
指针比较
接上面的例子,在我的机器上pShape2和pRollable2的值(所指向的地址)分别为:
pShape2: 0x0039A294, pRollable2:0x0039A290
说明dynamic_cast在进行转型的时候对不同多态类型设置了不同的偏移量。接下来的问题是
pRollable2 == pShape2
这个表达式应该返回什么呢?答案是:1,即指针比较相等。也许从C语言转到C++的朋友可能会感到困惑,因为在C语言中指针的比较只是值比较而已。显然,对于多态类型,C++编译器为==运算符做了更多的幕后工作来保证指针比较注重对象的同一性而非指针的值。至于实现细节涉及到C++对象模型,这是我还不甚熟悉的内容,故本文不再深入。
?
参考
C++ Common Knowledge Item27,28
C++ Typecasting