2010-05-07 19 views
-1
class A 
{ 
public: 
int i; 
int j; 

}; 

class B : public A 
{ 
public: 
int k; 

}; 

main() 
{ 
    A *a = new B; 

} 

是否可以访问切片数据?如何访问对象切片?

+4

这里没有对象切片。你可以说得更详细点吗? *访问*对象切片的含义是什么? – Naveen 2010-05-07 10:01:11

+1

请参阅http://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c关于 – 2010-05-07 10:02:00

+0

的一个很好的讨论@Naveen:但除非你作为程序员保持轨道,记住它是一个B,没有办法知道'* a'也包含B部分,所以它和切片一样好。 – UncleBens 2010-05-07 14:01:15

回答

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的唯一保证是它的第一个数据成员的地址与对象的地址相同。

0

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

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

的前提是,你实际上肯定知道,在代码中这点a总是指B一个实例,因为对于缺乏虚函数和一个虚函数表,是没有办法的要在运行时测试的语言,如果该类型是有效的。


技术上,还未有任何切片,你就不能以其他方式访问它,因为所有的编译器知道,你有一个指向类型A的对象,而这正是你就必须知道的情况下,更好。


IMO,如果你只使用继承来的数据字段添加到类,它是唯一有保存数据,你一般不应使用指针都搞乱基类。

如果您只显示部分代码,并且您确实有虚拟功能,请改为使用dynamic_cast,因为可以检查转换是否有效。