C++ 强制派生类重载非抽象基类中的虚拟方法

C++ 强制派生类重载非抽象基类中的虚拟方法,c++,inheritance,abstract-class,virtual-functions,C++,Inheritance,Abstract Class,Virtual Functions,我正在使用一个简单的克隆模式编写一些代码,如果我能够强制派生类重写该克隆模式,但保留使用基类的能力,我希望这样做。(因此我不想将clone方法声明为纯虚拟方法。) 是否在编译器级别强制执行此限制 >我接触过C++有一段时间,但我记得你可以有纯的虚拟方法。 // in header class YourBase { public: virtual Foo bar() = 0; }; // in source Foo YourBase::bar() { // a default impl

我正在使用一个简单的克隆模式编写一些代码,如果我能够强制派生类重写该克隆模式,但保留使用基类的能力,我希望这样做。(因此我不想将clone方法声明为纯虚拟方法。)


是否在编译器级别强制执行此限制 < P> >我接触过C++有一段时间,但我记得你可以有纯的虚拟方法。
// in header
class YourBase {
public:
  virtual Foo bar() = 0;
};

// in source
Foo YourBase::bar() {
  // a default impl
}

这应该强制子类重写Bar(),而在BASE < /P> < P>中留下一个可用的BIL(),这是我接触C++的一段时间,但我记得你可以用体来实现纯虚方法。

// in header
class YourBase {
public:
  virtual Foo bar() = 0;
};

// in source
Foo YourBase::bar() {
  // a default impl
}

这将强制子类重写bar(),同时在基中保留一个可用的impl of bar()

不幸的是,您无法在编译时强制类重写具体基类的方法,但是您可以在每个
克隆
函数实现中简单地
断言
,该类型是该实现所在的类的类型

assert( typeid( *this ) == typeid( ThisClass ) );

然后运行一个测试,测试每个类的克隆功能。

不幸的是,您不能在编译时强制类重写具体基类的方法,但是您可以在每个
克隆
函数实现中简单地
断言
,该类型是该实现所在的类的类型

assert( typeid( *this ) == typeid( ThisClass ) );

然后运行一个测试,测试每个类的克隆功能。

即使基类
clone
方法是纯虚拟的,也不会强制子类的子类实现它。如果您要求派生类在其声明中包含某种类型的宏(声明被重写的方法以便它们必须实现),则可以实现这一点,但这并不理想。
virtual
意味着动态多态性,它本质上是一种运行时操作,必须通过运行时检查强制执行不变量。如果您想要编译时操作和不变检查,请改用静态多态性,这样做会变得非常简单。即使您的基类
clone
方法是纯虚拟的,也不会强制子对象的子对象实现它。如果您要求派生类在其声明中包含某种类型的宏(声明被重写的方法以便它们必须实现),则可以实现这一点,但这并不理想。
virtual
意味着动态多态性,它本质上是一种运行时操作,必须通过运行时检查强制执行不变量。如果您想要编译时操作和不变检查,请改用静态多态性,这样的事情就变得非常简单了。啊,我很害怕。好吧,我正处于重新设计的中间,所以我会设法解决的。非常感谢。啊,我很害怕。好吧,我正处于重新设计的中间,所以我会设法解决的。非常感谢。该实现没有帮助,因为使用只克隆抽象类部分的克隆实现是没有用的。唯一的影响是,
YourBase
不能单独实例化,因为它是抽象的。也许你的“使用我的基类的能力”有点模糊。我想你指的是在派生类中使用impl-in基类的能力。这个实现没有帮助,因为它在使用只克隆抽象类部分的克隆实现时没有用。唯一的影响是,
YourBase
不能单独实例化,因为它是抽象的。也许你的“使用我的基类的能力”有点模糊。我想你指的是在派生类的基类中使用impl的能力。