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

It'*_*ete 5 c++ inheritance virtual-functions pure-virtual

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

但是,我偶然发现了一些有趣的事情......

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

// 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...
}
Run Code Online (Sandbox Code Playgroud)

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

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

通过这种方法,我有什么遗漏或做错了吗?谢谢您的帮助!

fra*_*ji1 5

Func 调用的是虚拟的,而不是纯虚拟的。您必须使用范围运算符来限定调用,即 AbstractClass::Step1() 来调用该(虚拟纯)函数。因为你不是,所以你总是会得到派生类的实现。

  • 事实上,这就是 OO 和 C++ 的强大之处。您可以编写“过程”,派生类可以在其中指定详细信息。考虑一下通信协议。建立连接(); while(!Done()) {SendRequest(); GetResponse();} TerminateConnection(); 所有这些方法都可以是“虚拟的”,一个派生类使用 TCP,另一个派生类使用更高级别的“连接”机制,或者更简单的点对点 RS-232 协议在其 Implements/TerminateSession() 方法中没有任何内容。然而,您定义了一个可以轻松实现和扩展的小型框架。 (3认同)