2016-12-26 3 views
0

Возможно ли в C++ сделать это?Наследование: вызов производной функции класса из базового класса

class Base { 
    int a(Derived d) { d.b(); } 
}; 

class Derived : public Base { 
    int b(); 
}; 

Должен ли я включать Derived.hpp даже в Base.hpp?

+0

Сделайте 'b()' чистой виртуальной функцией в 'Base'. –

+0

Добро пожаловать в переполнение стека. Пожалуйста, найдите время, чтобы прочитать [The Tour] (http://stackoverflow.com/tour) и обратитесь к материалу из [Справочного центра] (http://stackoverflow.com/help/asking) о том, что и как вы можете спросите здесь. –

+0

С объявлением вперед и разделом объявления из определения, ваш образец может работать. Но я не уверен, что то, что вы показываете, действительно то, что вы хотите. – Jarod42

ответ

1

Возможно ли в C++ сделать это?

Да, это очень легко и основной узор (так называемый полиморфизм или Template Method Pattern), используемые в языке С ++:

class Base { 
    int a() { b(); } // Note there's no parameter needed! 
// Just provide a pure virtual function declaration in the base class 
protected:  
    virtual int b() = 0; 

}; 

class Derived : public Base { 
    int b(); 
}; 
+0

Вы должны помнить, что вы не вызываете такие функции в конструкторе или дескрипторе, иначе вы получите чистый вызов функции. – paweldac

+0

@paweldac К счастью, это не так в образце OP. Если вам нужно это сделать, ваш ответ устраняет эту проблему. –

+0

просто хотел дать понять другим читателям, которые могли бы использовать предлагаемый код. Верно, что в вопросе OPs эта ошибка не будет возникать :) – paweldac

0

следующие компилирует:

class Derived; 

class Base { 
public: 
    int a(Derived d); 
}; 

class Derived : public Base { 
public: 
    int b() { return 42; } 
}; 

int Base::a(Derived d) { d.b(); } 
+0

Он компилируется, да. Хотя я боюсь, что это не то, что здесь задают (как вы упомянули в комментарии). –

0

Можно вызывать функции из класса Derived из базового класса с идиомой C++, называемой «Curiously recurring template pattern» CRTP. Пожалуйста, найдите вызов ниже:

template <class Child> 
struct Base 
{ 
    void foo() 
    { 
     static_cast<Child*>(this)->bar(); 
    } 
}; 

struct Derived : public Base<Derived> 
{ 
    void bar() 
    { 
     std::cout << "Bar" << std::endl; 
    } 
}; 
+0

Это еще один способ сделать это, да. –

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