Problema de herança da classe C ++
-
20-09-2019 - |
Pergunta
Olá, tenho duas aulas, uma chamada instrução, uma chamada LDI que herda da aula de instrução.
class Instruction{
protected:
string name;
int value;
public:
Instruction(string _name, int _value){ //constructor
name = _name;
value = _value;
}
~Instruction(){}
Instruction (const Instruction &rhs){
name = rhs.name;
value = rhs.value;
}
void setName(string _name){
name = _name;
}
void setValue(int _value){
value = _value;
}
string getName(){
return name;
}
int getValue(){
return value;
}
virtual void execute(){}
virtual Instruction* Clone() {
return new Instruction(*this);
}
};
/////////////end of instruction super class //////////////////////////
class LDI : public Instruction{
void execute(){
//not implemented yet
}
virtual Instruction* Clone(){
return new LDI(*this);
}
};
Em seguida, crio um ponteiro de instrução de tipo e tento destacar uma nova instância do tipo LDI.
Instruction* ptr;
ptr = new LDI("test", 22);
Recebo os seguintes erros do compilador. Alguma idéia do que estou fazendo de errado?
functions.h:71: error: no matching function for call to ‘LDI::LDI(std::string&, int&)’
classes.h:54: note: candidates are: LDI::LDI()
classes.h:54: note: LDI::LDI(const LDI&)
Solução
O código: new LDI(name, val)
diz especificamente "ligue para o construtor LDI com um name
e val
."
Não há construtor LDI que toma name / val
. Na verdade, não vejo um construtor para o LDI.
Se você deseja usar o construtor de uma classe base, aqui está como:
public LDI(string _name, int _value) // Public constructor for LDI
: Instruction(_name, _value) // Delegate to the base-class constructor
{
// Do more LDI-specific construction here
}
Outras dicas
LDI::LDI (string _name, int _value):Instruction(_name,_value){}
Você precisa fornecer um construtor para aula derivada LDI
, que por sua vez chama o construtor de classe base correto.
ptr = new LDI("test", 22);
Neste momento, o compilador procura um LDI
construtor que leva (string,int)
Como argumentos, como não existe esse construtor, desde que os berços do compilador.
LDI(string _name, int _value)
{
}
Ao fornecer o construtor de classe derivado, resolverá a questão da compilação. Mas, por padrão, o construtor de classe derivado não chamará o construtor de classe base apropriado; nesse caso Instruction(_name,_value)
(Ele chama apenas o construtor padrão). Para ligar para o construtor de classe base correto, você precisa invocar o construtor da classe base da lista inicial de inicializador de classe derivada.
assim.
LDI::LDI (string _name, int _value):Instruction(_name,_value){}
Construtores, destruidores, operador de tarefas, funções de amigos e classes de amizade de classes base não são herdadas por classes derivadas.
FIRS de tudo o que você deve definir e declarar construtor para LDI (String _name, int _value). Você inicializa seu construtor de classe base também ldi :: ldi (string _name, int _value): Instrução (_name, _value) {}. Segundo, será bom se adicione a palavra -chave vritual antes do seu destruidor de classe base. Se o seu destruidor de classe base não é virtual e você escrever esta instrução de código* ptr; ptr = novo ldi ("teste", 22); excluir *ptr;
Destrutor para o LDI nunca ligou. Mantenha o destruidor da classe base virtual para destruir correto para sua hierarquia de objetos