Почему конструктор для производного класса может быть определен только в классе для C ++?

0

Почему мой код ниже бросает ошибку компиляции, ссылаясь на неопределенную ссылку на Base :: Base(), неопределенную ссылку на vtable для Derived и bad reloc address 0x0 в разделе ".ctors". Но когда я определяю конструктор для Derived внутри класса, компилятор может скомпилировать код.

#include <iostream>

class Base{
public: 
    Base();
    virtual ~Base();
};

class Derived : public Base{
public:
    Derived(double theob_);
    virtual ~Derived();
private: 
    double theob;
};

Derived::Derived(double theob_):theob(theob_){}

int main(){
    return 0;
}
  • 0
    см. stackoverflow.com/questions/3065154/…
  • 0
    Что это значит, определяя деструктор?
Показать ещё 1 комментарий
Теги:
class

2 ответа

4
Лучший ответ

Ваш блок компиляции объявляет Base::Base() но не определяет его. Ваш производный конструктор вне тела класса реализован как не-встроенная функция, и как таковая всегда будет сгенерирована и будет ссылаться на этот конструктор, который не включен в блок компиляции. Если вы включите производный конструктор в описание класса, он станет встроенным, и компилятор будет генерировать код для него, если он действительно вызывается. Что в вашем случае это не так, поскольку вы никогда не создаете экземпляр Derived. Если вы действительно строили такой экземпляр, например, написав Derived d; внутри main, у вас будет такая же проблема. Вы можете сделать Base::Base inline no-op:

class Base{
public: 
    Base() {}
    virtual ~Base();
};
0

Когда вы определяете конструктор внутри своего класса, вы делаете конструктор встроенным методом. Поэтому он не будет создан до тех пор, пока он не понадобится, т.е. пока вы не объявите переменную класса.
Попробуй это:

int main(){
    Derived var(0.0);
    return 0;
}

вы получите ту же самую ошибку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню