如何访问对象切片?

时间:2010-05-07 09:56:43

标签: c++

class A
{
public:
int i;
int j;

};

class B : public A
{
public:
int k;

};

main()
{
  A *a = new B;

}

是否可以访问切片数据?

2 个答案:

答案 0 :(得分:1)

切片看起来像这样:

struct B {
    virtual ~B() { }
};
struct D : public B {
    int a, b;
};

int main()
{
    D der;
    B bas(der);  // der is sliced!
}

即使信息存在,B bas对象也无法查看D der的额外信息。我们说额外的信息被“切掉了”。 bas无法访问其中任何一个,因为标准允许D个对象(几乎)任意存储在内存中,用于alignment目的。 der唯一的保证是它的第一个数据成员的地址与对象的地址相同。

答案 1 :(得分:0)

我相信答案是向下投射指针。

static_cast<B*>(a)->k = 10;

前提是您确实确定,此时代码a中始终引用B的实例,因为缺少虚函数如果该演员表是有效的话,那么该语言无法在运行时进行测试。


从技术上讲,没有任何东西被切片,你只是无法访问它,否则因为所有编译器都知道,你有一个指向A类对象的指针,这是你必须要知道更好的情况。


IMO,如果你只使用继承将数据字段添加到只保存数据的类中,你通常不应该搞乱指向基类的指针。

如果您只显示部分代码并且其中有虚拟函数,请改用dynamic_cast,因为这样可以检查强制转换是否有效。