2016-09-25 4 views
-1

Мне нужно, чтобы производный класс вызывал свою новую функцию, как показано ниже. Я пробовал много разных вариантов и позиций ключевых слов.Наследование и использование производной функции

создать базовый класс с двумя методами преднагрузки и нагрузки. Точка PreLoad заключается в загрузке вещей, которые всегда необходимо загружать, а Загрузить используется для того, чтобы класс загружал то, что ему нужно для работы.

class Base 
    { 
    public: 
     Base(); 
     void PreLoad(); 
     virtual void Load(); 
    }; 

    Base::Base() { 
     PreLoad(); 
    } 

    void Base::PreLoad() { 
     Load(); 
    } 

    class Derived : public Base { 
    public: 
     virtual void Load() { 
      std::cout << "Hia" << std::endl; 
     } 
    }; 

    int main() 
    { 
     Derived d = Derived(); 
     d.PreLoad(); 
     return 0; 
    } 
+0

Для того, чтобы полиморфизм работал, вам необходимо использовать ссылки или указатели на класс * base *. Затем вы инициализируете ссылку или указатель на ссылку/указываете на производный объект. Например. 'Base * base = new Derived;' Это на самом деле один из немногих случаев, когда указатели полезны в современном C++. Но тогда в «современном» C++ вместо этого использовался бы умный указатель, такой как ['std :: unique_ptr'] (http://en.cppreference.com/w/cpp/memory/unique_ptr), как в' std :: unique_ptr base (new Derived); ' –

+0

@ πάντα ῥεῖ Вот почему я попытался описать свою проблему ... –

+1

Я не понимаю, что вы имеете в виду [работает как ожидается] (http://coliru.stacked-crooked.com/a/f22d7d3fb686cb31) для меня. –

ответ

3

Ваш код отсутствует реализация для Load в базовом классе. У вас есть два варианта здесь:

  • Make Load() чисто виртуальный - этот вариант хорош, когда подклассы MUST переопределение Load(). Demo.
  • Предоставить реализацию по умолчанию для Load() - эта опция хороша, если классы имеют опцию переопределения Load(), но реализация по умолчанию есть. Demo.
+0

На самом деле это не мой код. Это макет проблемы. В настоящее время у меня есть реализация по умолчанию для Load. Однако производный класс только когда-либо вызывает реализацию по умолчанию. –

+0

@ Zyneak Это означает, что вы не вызываете его так же, как ваши «главные» шоу. Я добавил вторую демоверсию, которая имеет реализацию по умолчанию, она работает отлично. – dasblinkenlight

+0

Это правильно. Фактически это класс PreLoad из конструктора. Я не думал, что это имеет значение. –

1

Настоящая проблема с вашим кодом (при условии, что вы предоставили реализацию для Base :: Load()), заключается в том, что виртуальный метод (Load) вызывается из конструктора Base.

В то время, когда вызывается конструктор Base, дочерний элемент (Производный) не полностью создан. Таким образом, избыточная загрузка никогда не будет вызвана.

+0

Это правильно, однако это было правкой после того факта, как в то время, когда я не думал, что это имеет значение. –

Смежные вопросы