首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dynamic_cast对static_cast无效*

dynamic_cast对static_cast无效*
EN

Stack Overflow用户
提问于 2014-04-15 05:18:46
回答 1查看 1.2K关注 0票数 8

在下面程序的最后两行中,static_cast<void*>dynamic_cast<void *>的行为不同。据我所知,dynamic_cast<void*>的结果总是解析为完整对象的地址。所以它在某种程度上使用RTTI。有人能解释编译器是如何使用RTTI来区分两者的吗?

代码语言:javascript
复制
#include <iostream>
using namespace std;
class Top {
protected:
int x;
public:
    Top(int n) { x = n; }
    virtual ~Top() {} 
    friend ostream& operator<<(ostream& os, const Top& t) {
        return os << t.x;
    }
};
class Left : virtual public Top {
protected:
    int y;
public:
    Left(int m, int n) : Top(m) { y = n; }
};
class Right : virtual public Top {
protected:
    int z;
public:
    Right(int m, int n) : Top(m) { z = n; }
};
class Bottom : public Left, public Right {
    int w; 
public:
    Bottom(int i, int j, int k, int m): Top(i), Left(0, j), Right(0, k) { w = m; }
    friend ostream& operator<<(ostream& os, const Bottom& b) {
        return os << b.x << ',' << b.y << ',' << b.z<< ',' << b.w;
    }
};
int main() {
    Bottom b(1, 2, 3, 4);
    cout << sizeof b << endl;
    cout << b << endl;
    cout << static_cast<void*>(&b) << endl;
    Top* p = static_cast<Top*>(&b);
    cout << *p << endl;
    cout << p << endl;
    cout << static_cast<void*>(p) << endl;
    cout << dynamic_cast<void*>(p) << endl;
    return 0;
}

可能的输出:https://ideone.com/WoX5DI

代码语言:javascript
复制
28
1,2,3,4
0xbfcce604
1
0xbfcce618
0xbfcce618
0xbfcce604
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-15 07:54:05

从5.2.7 / 7:

如果T是“cv指针”,则结果是指向v.所指向的最派生对象的指针,否则,将进行运行时检查,以查看v指向或引用的对象是否可以转换为指向或引用的类型。

因此,使用dynamic_cast<void*>(o),您可以得到一个指向最“派生”对象的第一个字节的指针(如果o是多态的)。

编译器为dynamic_cast<void *>(...)生成的代码如下所示:

代码语言:javascript
复制
static_cast<void*>(dynamic_cast<most_derived_type *>(...))

此属性通常用于序列化。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23075200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档