Можно ли реализовать абстрактный класс без чистых виртуальных функций в C++?
Если вы выбираете точку зрения из статического полиморфизма, Вы можете сделать это!
В абстрактном базовом классе просто отсутствовала бы реализация метода по умолчанию для метода интерфейса из производного класса.
Кроме того, вы можете использовать защищенные конструкторы для этих шаблонов базового класса CRTP, чтобы требовать наследования для создания экземпляров.
ОБНОВЛЕНИЕ:
я нашел хорошее слайд-шоу, объясняющее статический и динамический полиморфизм всесторонне. Каждая техника имеет свои плюсы и минусы и определенные области применения, кроме того, вы можете комбинировать обе техники (разумеется, с умом).
Чтобы немного уточнить, я приведу образец:
template<class Derived>
class AbstractBase
{
public:
// Equivalent for a pure virtual function
void foo()
{
// static_cast<> enforces an 'Is a' relation from Derived to AbstractBase
static_cast<Derived*>(this)->fooImpl();
}
// Equivalent for simple virtual function (overidable from Derived)
void bar()
{
static_cast<Derived*>(this)->barImpl();
}
// Default implementation for any call to bar()
void barImpl()
{
}
protected:
AbstractBase() {}
};
// Compilation will fail, since ConcreteClass1 doesn't provide
// a declaration for fooImpl()
class ConcreteClass1
: public AbstractBase<ConcreteClass1>
{
}
// Compiles fine
class ConcreteClass2
: public AbstractBase<ConcreteClass2>
{
public:
void fooImpl()
{
// Concrete implementation ...
}
}
В следующем примере показано, что представленный выше шаблон обеспечивает связь «Является» между абстрактным классом и наследующим классом (параметр шаблона).
class ConcreteClass3
{
public:
void fooImpl()
{
// Concrete implementation ...
}
}
// Instantiation will fail, because
// * the constructor is protected
// * at least the static cast will fail
AbstractBase<ConcreteClass3> instance;
person
πάντα ῥεῖ
schedule
03.07.2013