从抽象基类成员函数调用纯虚拟函数

Calling Pure Virtual Function From Abstract Base Class Member Function?

本文关键字:虚拟 函数 函数调用 成员 抽象 基类      更新时间:2023-10-16

因此,基于粗略的搜索,我已经知道从构造函数调用虚拟函数(纯函数或其他函数)是不可行的。我已经重组了我的代码,以确保我不会这么做。虽然这会导致我的类的用户在他们的代码中添加一个额外的函数调用,但这真的没什么大不了的。也就是说,他们现在不是在循环中调用构造函数,而是调用函数,这(事实上!)提高了代码的性能,因为我们不需要每次都构建和销毁有问题的对象。

然而,我偶然发现了一些有趣的东西。。。

在抽象类中,我有这样的东西:

// in AbstractClass.h:
class AbstractClass {
 public:
  AbstractClass() {}
  virtual int Func(); //user can override
 protected:
  // Func broken up, derived class must define these
  virtual int Step1() = 0;
  virtual int Step2() = 0;
  virtual int Step3() = 0;
// in AbstractClass.cpp:
int AbstractClass::Func() {
  Step1();
  // Error checking goes here
  Step2();
  // More error checking...
  // etc...
}

基本上,纯虚拟函数大多数时候都遵循一个通用结构,但如果不遵循,Func()是虚拟的,并允许派生类指定顺序。但是,每个步骤都必须在派生类中实现。

我只是想确保我在这里没有做错什么,因为Func()函数调用的是纯虚拟函数。也就是说,使用基类,如果调用StepX(),就会发生不好的事情。但是,该类是通过创建派生对象,然后调用Func()来使用的(例如,MyDerivedObject.Fonc();)在该派生对象上,应该正确重载所有纯虚拟函数。

按照这种方法,我有没有遗漏或做得不正确?谢谢你的帮助!

Func调用的是虚拟的,而不是纯虚拟的。您必须使用作用域运算符来限定调用,即AbstractClass::Step1()才能调用the(虚拟纯)函数。由于不是,所以您将始终通过派生类获得实现。

基类中的虚拟函数使派生类能够覆盖它。但事情似乎到此为止。

但是,如果基类虚拟函数是纯的,则会强制派生类实现该函数。

作为附带注释,您可以将Step1、Step2和Step3方法设为私有方法,这样编译器就可以阻止您直接调用它们。