В общем, то, что вы ищете, это ключевое слово virtual
. В двух словах virtual
заявляет, что этот метод может быть переопределен . Обратите внимание, что такой метод все еще может иметь реализацию - virtual
просто делает его перезаписываемым. Чтобы объявить «абстрактный метод», вы можете сказать, объявлять намерение , предоставьте реализацию в производном классе с = 0
, как показано ниже. Такие методы называются чисто виртуальными в C ++.
Однако есть некоторые предостережения, на которые вам следует обратить внимание. Как указано в комментарии ниже, вы вызывали method()
из конструктора SuperClass
. К сожалению, это невозможно в C ++ из-за порядка, в котором создаются объекты.
В C ++ конструктор производного класса сразу вызывает свой конструктор суперкласса, прежде чем размещать его члены или выполнять тело конструктора. Таким образом, члены базового класса конструируются первыми, а члены производного класса конструируются последними. Вызов виртуального метода из базового класса не будет работать так, как вы ожидаете в Java, поскольку производный класс еще не создан, и, таким образом, виртуальные методы еще не перенаправлены в производные реализации. Надеюсь, что это имеет смысл.
Однако вызов method()
для SuperClass
объекта после создания будет работать так, как вы ожидаете: он вызовет виртуальную функцию, которая выдаст «print».
class SuperClass {
public:
SuperClass() {
// cannot call virtual functions from base constructor.
}
virtual ~SuperClass() { } // destructor. as Kerrek mentions,
// classes that will be inherited from,
// should always have virtual destructors.
// This allows the destructors of derived classes
// to be called when the base is destroyed.
private:
void method() {
unimplementedMethod();
}
protected:
virtual void unimplementedMethod() = 0; // makes method pure virtual,
// to be implemented in subclass
}
SubClass.h
class SubClass : public SuperClass {
public:
SubClass() : SuperClass() { // how the superclass constructor is called.
}
// no need for "override" keyword, if the methd has the same name, it will
// automatically override that method from the superclass
protected:
void unimplementedMethod() {
std::cout << "print" << std::endl;
}
}