class A
{
public:
int i;
int j;
};
class B : public A
{
public:
int k;
};
main()
{
A *a = new B;
}
是否可以访问切片数据?
答案 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
,因为这样可以检查强制转换是否有效。