- 论坛徽章:
- 44
|
本帖最后由 windoze 于 2015-08-19 17:51 编辑
回复 10# littledick
转型前你总得猜一下吧,好多地方都有类似的东西:
- struct Base {
- virtual int type_tag()=0;
- };
- struct Sub1 : public Base {
- virtual int type_tag() { return 1; }
- };
- struct Sub2 : public Base {
- virtual int type_tag() { return 2; }
- };
- ...
复制代码 然后用的时候就会这么写:
- void f(Base *p) {
- switch(p->type_tag()) {
- case 1: {
- Sub1 *ps1=static_cast<Sub1 *>(p);
- ps1-> ...
- }
- case 2: {
- Sub2 *ps1=static_cast<Sub2 *>(p);
- ps2-> ...
- }
- }
- }
复制代码 我知道这段代码很丑,不过重点不在这儿,而是说这段代码里就应该用static_cast,不应该用dynamic_cast
必须用dynamic_cast的地方是这样的:
- struct Base1 {
- virtual ~Base1(){}
- };
- struct Base2 {
- virtual ~Base2(){}
- };
- struct Sub : public Base1, Base2 { ... };
- void f(Base1 *pb1) {
- Base2 *pb2=dynamic_cast<Base2 *>(pb1);
- pb2->...
- }
复制代码 上面这段代码必须用dynamic_cast,否则就是错的。 |
|