我考虑使用受保护的构造函数,但这不能完全解决问题,因为继承它的类仍然可以实例化基类。
至于私有构造函数,派生类也将无法实例化。
因此,任何适当的技术都将不胜感激。
我考虑使用受保护的构造函数,但这不能完全解决问题,因为继承它的类仍然可以实例化基类。
至于私有构造函数,派生类也将无法实例化。
因此,任何适当的技术都将不胜感激。
不清楚您真正需要的是什么。因此,让我尝试澄清一些要点:
纯虚函数可以有定义
如果您关心的是要为基类中的所有虚函数提供定义,则可以提供纯虚函数的定义,这些定义将可用于静态分派。
protected 管理访问你的base子对象,而非每个base实例
有一个常见的误解是protected
允许特定的派生类型访问base
的任何实例。这是不正确的。关键字protected
授予对派生类型内base
子对象的访问权限。
class base {
protected: base() {}
};
class derived : public base {
derived() : base() { // fine our subobject
base b; // error, `b` is not your subobject
}
};
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;
virtual function-signature = 0;
),没有它们就无法创建抽象类。我在书中读到过这个概念。抽象类是一种专门设计用作基类的类。抽象类至少包含一个纯虚函数。你可以通过在类声明中的虚成员函数声明中使用纯说明符(= 0)来声明一个纯虚函数。