繁体   English   中英

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

[英]Calling Pure Virtual Function From Abstract Base Class Member Function?

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

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

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

// 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.Func();)来利用该类,该派生对象应该正确重载所有纯虚函数。

通过遵循此方法,我是否遗漏了什么或做错了什么? 谢谢您的帮助!

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM