C ++:在抽象类中调用Abstract方法

时间:2014-06-17 16:50:41

标签: c++ abstract-class virtual

我有一个包含两个类的抽象类(一个抽象,一个非抽象)。 我想从非抽象方法调用抽象方法。

这就是我想要做的事情:

class abstractClass { 
     public:
     virtual void abstractMethod() = 0 ;
     void nonAbstractMethod();
}

in .cpp:

void abstractClass::nonAbstractMethod() {
     abstractClass::abstractMethod();

     /* ... */

}

是否可以在c ++中使用?

这里的问题是nonAbstracMethod不是静态的,所以我不能在没有对象实例的情况下调用它。但这是一个抽象的课程!我无法实例化它......我怎么能用这个来管理呢?

我经常在java中这样做,但我在c ++中找不到...

3 个答案:

答案 0 :(得分:4)

具体子类将提供其abstractMethod()的版本。通过虚拟调用机制,当使用具体子类的实例调用nonAbstractMethod()时,将调用abstractMethod()的正确实现。也就是说,如果您没有使用类型名称限定该方法(您可以这样做,只要您还在abstractClass *中提供实现)。

你应该记得在abstractClass虚拟中使用析构函数,因此当通过abstractClass指针删除对象时会调用正确的析构函数。

另外,您应该知道memeber函数在构造函数\析构函数中是静态绑定的。否则,您调用的方法是指某个对象的某些部分尚未构造或已经被破坏。

这是面向对象的编程101

*是的,纯虚函数可以实现。

答案 1 :(得分:1)

  

我经常在java中这样做,但我没有在c ++中找到...

这是我对你的问题不太了解的一点。如果您知道如何在Java中执行此操作,那么C ++中究竟出现了什么问题?您需要做的就是添加一个虚拟析构函数,并考虑将抽象方法设为私有(而不是像在Java中那样受到保护)。

爪哇:

public abstract class Example {
    protected abstract void abstractMethod();
    public void nonAbstractMethod() {
        abstractMethod();
    }
}

C ++:

class Example {
private:
    virtual void abstractMethod() = 0;
public:
    void nonAbstractMethod() {
        abstractMethod();
    }
    virtual ~Example() {}
};

提示:对“模板方法设计模式”或“非虚拟接口习语”进行一些Google研究。

答案 2 :(得分:0)

你需要一个实例,但这是一个抽象类。因此实例实际上必须是实现纯虚方法的子类。

你的语法就是:

void abstractClass::nonAbstractMethod() {
     abstractMethod();
    /* ... */
}

所以它看起来像这样:

class ConcreteClass : public abstractClass {
  virtual void abstractMethod() { //do something 
  }
};

int main() {
  abstractClass *a = new ConcreteClass();
  a->nonAbstractMethod();
  return 0;
}

此外,在C ++中,请记住,打算用作基类的类的析构函数(如此抽象类)应始终具有虚拟析构函数,以防它们通过指向基类或引用方式销毁。基础。

如果你选择在构造抽象类时使析构函数成为纯虚拟的一个函数,那么纯虚析构函数也必须有一个实现(尽管它可能不需要做任何事情;如果有的话,空的很好没有资源可以发布。)