Проблема наследования классов C ++ - PullRequest
1 голос
/ 15 ноября 2009

Привет, у меня есть два класса, один называется Инструкция, другой называется LDI, который наследуется от класса инструкции.

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);
    }
};

Затем я создаю указатель типа Instruction и пытаюсь указать новый экземпляр типа LDI.

Instruction* ptr;
ptr = new LDI("test", 22);

Я получаю следующие ошибки компилятора. Есть идеи, что я делаю не так?

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&)

Ответы [ 4 ]

8 голосов
/ 15 ноября 2009

Код: new LDI(name, val) специально говорит: «Вызовите конструктор LDI с name и val

Нет конструктора LDI, который принимает name / val. На самом деле, я вообще не вижу конструктора для LDI.

Если вы хотите использовать конструктор базового класса, вот как:

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
}
3 голосов
/ 15 ноября 2009
LDI::LDI (string _name, int _value):Instruction(_name,_value){}

Вам необходимо предоставить конструктор для производного класса LDI, который, в свою очередь, вызывает правильный конструктор базового класса.

ptr = new LDI("test", 22);

На данный момент компилятор ищет конструктор LDI, который принимает (string,int) в качестве аргументов, поскольку такого конструктора не предусмотрено, если компилятор выводит.

LDI(string _name, int _value)
{ 
}

Предоставление конструктора производного класса решит проблему компиляции. Но по умолчанию конструктор производного класса не будет вызывать соответствующий конструктор базового класса; в этом случае Instruction(_name,_value) (он вызывает только конструктор по умолчанию). Чтобы вызвать правильный конструктор базового класса, необходимо вызвать конструктор базового класса из списка инициализатора производного класса.

так.

LDI::LDI (string _name, int _value):Instruction(_name,_value){}
1 голос
/ 15 ноября 2009

Конструкторы, деструкторы, оператор присваивания, функции друзей и классы друзей базовых классов не наследуются производными классами.

0 голосов
/ 15 ноября 2009

Прежде всего, вы должны определить и объявить конструктор для LDI (строка _name, int _value). Вы можете инициализировать конструктор базового класса также LDI :: LDI (строка _name, int _value): Instruction (_name, _value) {}. Во-вторых, будет хорошо, если вы добавите ключевое слово vritual перед деструктором базового класса. Если ваш деструктор базового класса не виртуальный и вы пишете этот код Инструкция * ptr; ptr = новый LDI («тест», 22); удалить * ptr;

деструктор для LDI никогда не вызывался. Держите деструктор базового класса виртуальным для правильного уничтожения вашей иерархии объектов

...