C++ 这会导致对象切片吗?

C++ 这会导致对象切片吗?,c++,object-slicing,C++,Object Slicing,假设我有一个指向抽象类的指针数组: Piece *pieces[2]; // where piece is an abstract class 我有两个类扩展了Piece,分别是King和Queen。我将King分配给parties中的一个点,将Queen分配给另一个点: pieces[0] = new King(); pieces[1] = new Queen(); 如果我没有重载赋值运算符,是否会发生切片?或者pieces[0]是King的实例,而pieces[1]是Queen的实例?该

假设我有一个指向抽象类的指针数组:

Piece *pieces[2]; // where piece is an abstract class
我有两个类扩展了
Piece
,分别是
King
Queen
。我将
King
分配给
parties
中的一个点,将
Queen
分配给另一个点:

pieces[0] = new King();
pieces[1] = new Queen();
如果我没有重载赋值运算符,是否会发生切片?或者
pieces[0]
King
的实例,而
pieces[1]
Queen
的实例?该数组中发生了什么(如果这是C++)


编辑:查看相关代码的完整示例。

不会发生切片。您正在执行指针分配,而不是对象分配。

不会发生切片。您正在执行指针赋值,而不是对象赋值。

这实际上并没有编译:您不能将
King*
(表达式
新King
的类型)赋值给
片段(表达式
*片段[0]

但要回答您的隐含问题,请执行以下操作:

Piece *piece = new King(); // fine, no slicing, just assigning a pointer
*piece = Queen();          // oops, slicing - assigning a Queen to a Piece

在你问题中的数组中,假设你写了
parties[0]=newking,等等,您只需存储两个
Piece
指针,其中一个指向
King
,另一个指向
Queen
,这实际上并不编译:您不能将
King*
(表达式的类型
new King
)分配给
Piece
(表达式的类型
*片段[0]

但要回答您的隐含问题,请执行以下操作:

Piece *piece = new King(); // fine, no slicing, just assigning a pointer
*piece = Queen();          // oops, slicing - assigning a Queen to a Piece

在您问题中的数组中,假设您编写了
pieces[0]=new King;
,等等,您只需存储两个
Piece
指针,其中一个指向
King
,另一个指向
Queen

是的切片将发生

每当您试图将派生类对象放入其任何基类时,总是会发生切片。如果派生类添加了基类不提供的某些功能,则此切片将可见

记住,当你不遵循OOP原则时,情况就是这样。原则说

"When you are deriving from any class you should not change the interface. 
The reason for inheritance is moving from generic to specific type, and not
 providing new functionality."
如果你遵循这个原则,那么切片行为可以定义为

“Moving from specific behaviour to more general behaviour”. 
通过指针对象进行切片是临时的,您可以将指针强制转换回派生类以获得原始行为。通过对象进行切片是永久的

NOTE:- Slicing always does not happen in case of private inheritance. 
If you try to do so it will result in compilation error.
(For more information on private inheritance:-http://stackoverflow.com/questions/19075517/object-slicing-in-private-inheritance/19083420?noredirect=1#19083420)

是的,将进行切片

每当您试图将派生类对象放入其任何基类时,总是会发生切片。如果派生类添加了基类不提供的某些功能,则此切片将可见

记住,当你不遵循OOP原则时,情况就是这样。原则说

"When you are deriving from any class you should not change the interface. 
The reason for inheritance is moving from generic to specific type, and not
 providing new functionality."
如果你遵循这个原则,那么切片行为可以定义为

“Moving from specific behaviour to more general behaviour”. 
通过指针对象进行切片是临时的,您可以将指针强制转换回派生类以获得原始行为。通过对象进行切片是永久的

NOTE:- Slicing always does not happen in case of private inheritance. 
If you try to do so it will result in compilation error.
(For more information on private inheritance:-http://stackoverflow.com/questions/19075517/object-slicing-in-private-inheritance/19083420?noredirect=1#19083420)

我可以假装没有编译器错误,但这并不意味着我可以假装知道结果代码。请把你的代码固定到实际的C++。@本杰明兰德利OK,我把它改为我认为最好的,给出了我的问题的例子。我不想通过我的代码来描述错误的问题,所以这就是我尝试的原因。让代码只描述想法,而不必担心语法。您之前已经做了一半。您修复了一件事(删除了取消引用(
*
),但破坏了另一件事(用
&
替换
新的
)。您的代码现在可以编译了,但您所做的是未定义的行为(即使它看起来有效)。您正在创建一个临时对象,然后存储其地址。不要这样做。类似的操作。它在分号处超出了范围。您需要的是:
pieces[0]=new King;pieces[1]=new Queen;
还请记住,由于您使用的是
new
,因此您需要一个附带的
delete
,否则您会出现内存泄漏。因此,当您处理完对象后,您需要执行以下操作:
delete pieces[0];delete pieces[1]如果你使用A,你可以避免单调乏味。我可以假装没有编译器错误,但这并不意味着我可以假装知道结果代码。请把你的代码改为实际C++。我把它改成我认为最好的,给出我的问题的例子。我不想描述错误的问题。n通过我的代码,所以最初这就是为什么我试图让代码只描述想法,而不担心语法。您之前已经做了一半。您修复了一件事(删除了取消引用(
*
),但破坏了另一件事(用
&
替换
新的
)。您的代码现在可以编译了,但您所做的是未定义的行为(即使它看起来有效)。您正在创建一个临时对象,然后存储其地址。不要这样做。类似的操作。它在分号处超出了范围。您要做的是:
pieces[0]=new King;pieces[1]=new Queen;
还请记住,由于您使用的是
new
,因此您需要一个附带的
delete
,否则您会出现内存泄漏。因此,当您处理完对象后,您需要执行以下操作:
delete pieces[0];delete pieces[1]
如果您使用了,您可以避免那种繁琐。谢谢,这就是我要找的。很抱歉,代码没有编译;我是一名学生,我只是想知道这个概念,但我仍在努力完全理解指针数组。我将更改代码以使其编译,当我回到家可以测试和编译代码时,这样以后其他人在看这个问题时就不会感到困惑了。@AustinMoore:如果你有互联网连接,你可以随时测试你的代码(只要你坚持使用标准库):@BenjaminLindley:谢谢你的链接,实际上:)我用它来编译东西