【发布时间】:2017-03-07 13:02:35
【问题描述】:
我正在研究对象切片何时/为什么是危险的。
我阅读了一个关于 what is safe slicing VS dangerous slicing 的精彩链接。
以下是我可以总结的(粗略地说):-
-
安全,当基本类型为 value 时(例如
A)。 -
危险,当基本类型为 reference 时(例如
A&)。
阅读后,我在 Visual Studio + Resharper(一个 VS 插件)中创建了一个测试代码。
我认为我的情况是安全。但是,我在标记行 #1 处收到警告。
可能意外的对象切片从派生类 C 初始化值
class B1{ int field1=0; };
class B2{ int field2=0; };
class C: public B1,public B2{ };
class Test{
void f(B1 b){ } #2
void f2(){
C c;
f(c);
//^ possibly unintended object slicing #1
}
};
Resharper 的行为与我的看法相矛盾。
- 当类型为value时警告。
-
当类型为 reference 时无警告(将 #2 从
B1更改为B1&)。 - 当
C仅派生自B1时,始终无警告,无论#2是什么。 (B或B&)
可以总结成一个表格:-
| #2=B1 | #2=B1&
==================================================
multi-inherit | warn* | no-warn*
--------------------------------------------------
inherit only from B1 | no-warn | no-warn
但是,这是我所期望的:-
| #2=B1 | #2=B1&
===================================================================
multi-inherit | safe* | dangerous*
-------------------------------------------------------------------
inherit only from B1 | safe | safe
不一致的地方用*标记。
我对对象切片有误解,还是 Resharper 错了?
【问题讨论】:
-
实际上,切片只能在按值分配时成为问题,如果您使用pointers or references,您的对象将不会切片并且会正确地表现出多态性。
-
(已编辑)好点!你似乎是正确的....我现在明白了。谢谢!
-
@CoryKramer 如果您愿意,可以将其作为解决方案发布。 :)
标签: c++ resharper object-slicing