指针和对象切片
回答
是 - 指针base
需要能够指从base
派生的任何类型的对象,并仍保持正确的类型派生对象(以及它的价值,也是同样的道理与参考)。
“是的,它总是安全的。”他的问题承认不是“是”或“否”的答案。 –
这取决于你是否愿意定义“切片”的松散程度。从某种意义上讲,当你指向一个带有基指针(或引用)的派生对象时,任何非虚函数都会被切分。例如:
class A {
void Print() { cout << "Class A\n"; }
};
class B : public A {
void DoB() {}
void Print() { cout << "Class B\n"; }
};
B b;
A* a = &b;
a->DoB(); // Won't compile!
a->Print(); // Prints "Class A", not "Class B"
,因为我们使用的指针A
,所以编译器不知道它可以对指针调用DoB
到DoB
调用不起作用。这样,你就失去了B
的一部分,所以你可以把它当作切片的一种形式。
最后一行特别是一个称为“名称隐藏”现象的例子。由于Print
未在基类中声明为virtual
,而我们的指针类型为A
,编译器不知道它应该调用B::Print
而不是A::Print
。
这个问题的一个重要例子进场时你的析构函数:
class A {
~A() {}
};
class B : public A {
std::vector<int> v;
};
A* a = new B;
delete a; // What happens to B::v? Undefined behaviour!
这里,因为析构函数没有被标记为virtual
,它被称为基类的在非虚拟上下文析构函数,这意味着B
的析构函数不会被调用。
哇,这是一个很好的答案。非常丰富。谢谢! –
- 1. 切片使用指针切片
- 2. Golang指针切片和阵列
- 3. 原始对象的C++指针和复制对象的指针
- 4. 句柄和指针对象
- 5. 指针和Java对象
- 6. 封装和对象指针
- 7. 对象引用和对象指针
- 8. 无效指针指向对象指针
- 9. 指向类中对象的指针:push_back和指针冲突
- 10. 指针帮助,指向对象的指针和类
- 11. 当切片为指针时按索引访问切片
- 12. JS对象指针
- 13. fstream对象指针
- 14. FMOD对象指针
- 15. Java:NullException对象指针[]
- 16. JavaScript对象指针
- 17. C++对象指针
- 18. 指针转到排序切片
- 19. 复制指针向量而不切片
- 20. 使用指针作为切片的值
- 21. ,对象和指向对象的指针有什么区别?
- 22. 对象解引用指针的指针?
- 23. 对象B和对象B对象的引用没有指针
- 24. 的std ::对对象指针
- 25. Javascript对象排序和切片
- 26. 参考文献和对象切片
- 27. 如何使用指向该切片的指针获取切片项目
- 28. 不同对象的指针值和它的该指针
- 29. 面向对象的编程风格和指针指针
- 30. 指向const对象的指针自动转换为指向对象的指针
你可能会从这里学到最好的:http://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c – chris
我喜欢你如何提出矛盾的问题'指针可以是对象切片的受害者?'和'只要你使用了一个指针,你总是可以避免对象切片?'。这使得答案混淆。 – milleniumbug