Pergunta

Dizem que eu tenho uma matriz de ponteiros para uma classe abstrata:

Piece *pieces[2]; // where piece is an abstract class

E eu tenho duas classes que estendem Piece chamado King e Queen.Eu atribuir um King para um lugar em pieces e Queen para um outro lugar:

pieces[0] = new King();
pieces[1] = new Queen();

Se eu não sobrecarregado o operador de atribuição, faz o corte de ocorrer?Ou não pieces[0] é uma instância de King e pieces[1] é uma instância de Queen?O que está acontecendo na matriz (se este foi C++)?

EDITAR:Veja um exemplo completo de código em questão aqui.

Foi útil?

Solução

Na verdade isso não compila:você não pode atribuir um King * (o tipo da expressão new King) para um Piece (o tipo da expressão *pieces[0]).

Para responder a sua questão implícita, de que:

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

Na matriz-nos a sua questão, supondo que você tivesse escrito pieces[0] = new King;, etc., você tinha acabado de ser armazenar dois Piece ponteiros, um dos quais aponta para um King e uma das que aponta para uma Queen.

Outras dicas

Não corte irá ocorrer.Você está fazendo atribuição de ponteiro, e não objeto de atribuição.

Sim cortando irá ocorrer.

Corte sempre irá ocorrer sempre que você está tentando colocar o objeto de classe derivada para qualquer um de sua classe base.Este corte vai se tornar visível se sua classe derivada adicionou algumas funcionalidades que a sua classe base não fornecem.

Lembre-se, este é o caso quando você está seguindo não OOP diretores.Principal diz,

"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."

E, se você seguir este princípio, em seguida, corte o comportamento pode ser definido como,

“Moving from specific behaviour to more general behaviour”. 

O corte por meio de ponteiro objetos são temporários e você pode lançar novamente o ponteiro de classe derivada para obter o comportamento original.Cortando o objeto é permanente.

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top