Posso criar um objeto de uma classe derivada de construir o objeto de base com um parâmetro?
-
12-09-2019 - |
Pergunta
Em outras palavras, dado um shape
classe base e uma classe derivada rectangle
:
class shape
{
public:
enum shapeType {LINE, RECTANGLE};
shape(shapeType type);
shape(const shape &shp);
}
class rectangle : public shape
{
public:
rectangle();
rectangle(const rectangle &rec);
}
Eu gostaria de saber se eu poderia criar uma instância de rectangle
chamando:
shape *pRectangle = new shape(RECTANGLE);
e como eu poderia implementar o construtor de cópia, a fim de obter um novo rectangle
chamando:
shape *pNewRectangle = new shape(pRectangle);
Solução
Resposta curta: Não
Long Resposta:
Você precisa de um objeto de fábrica / método.
Você pode adicionar um método de fábrica estático para a classe base do cria o tipo de objeto apropriado.
class Shape
{
static Shape* createShape(shapeType type)
{
switch (type)
{
case RECTANGLE:return new rectangle();
...
}
}
};
A preferência pessoal:
Eu iria com uma classe completamente diferente de ser a fábrica em vez de usar um método estático na classe base. A razão para isso é que cada vez que você criar uma nova classe moldar o estilo forças acima de você para re-construir a classe Shape cada vez.
Assim, gostaria de separador para fora da fábrica em uma classe ShapeFactory.
Outras dicas
Você não pode fazer isso diretamente de dentro do construtor. Em vez disso, você vai precisar usar uma outra abordagem, como um Fábrica método .
O problema é que, quando você faz nova forma (...), você sempre vai retornar uma instância de forma - não retângulo. Se você quer um "retângulo", em algum momento, ele vai precisar ligar para novo retângulo (..). Um método poderia lidar com essa lógica para você, mas não a construção padrão em C ++.
Chamar um construtor sempre lhe dará um objeto do tipo do construtor.
new shape(...)
Eu acho que você quiser usar o padrão de design de fábrica em vez disso, onde há um método estático na forma que pode criar qualquer subtipo, se necessário.
shape *pRectangle = new shape(RECTANGLE);
Não há nenhuma maneira para que você crie uma classe derivada através da construção de um objeto base. Você tem que fazer um novo da própria classe derivada.
Em C ++ você pode usar fundição dinâmica para alcançar este objetivo, mas erm, não, não de dentro do construtor. Use-o como indicado acima em um método de fábrica
http://www.cprogramming.com/reference/typecasting/dynamiccast .html
Você pode fazer algo parecido com design Policy-Based. Seu código seria algo como
shape* pRectangle = new derrivedType<rectangle>();