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

C++ C++;:在抽象类中调用抽象方法,c++,abstract-class,virtual,C++,Abstract Class,Virtual,我有一个抽象类,包含两个类(一个抽象类,一个非抽象类)。 我想从非抽象方法调用抽象方法 这就是我想做的: class abstractClass { public: virtual void abstractMethod() = 0 ; void nonAbstractMethod(); } 在.cpp中: void abstractClass::nonAbstractMethod() { abstractClass::abstractMethod()

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

这就是我想做的:

class abstractClass { 
     public:
     virtual void abstractMethod() = 0 ;
     void nonAbstractMethod();
}
在.cpp中:

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

     /* ... */

}
< C++ >

是可能的吗? 这里的问题是nonAbstracMethod不是静态的,所以我不能在没有object实例的情况下调用它。但这是一个抽象类!我无法实例化它。。。我该如何处理这个问题


<>我经常在java中做这个,但是我没有发现C++中……/p>如何需要一个实例,但是这是一个抽象类。因此,实例实际上必须是实现纯虚拟方法的子类

您的语法将是:

void abstractClass::nonAbstractMethod() {
     abstractMethod();
    /* ... */
}
所以它看起来是这样的:

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

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

也请注意,在C++中,要想用作基类的类的析构函数(像这个抽象类)应该总是有虚析构函数,以防它们通过指向基的指针或引用BASE销毁。p>


如果在定义抽象类时选择将析构函数作为纯虚拟函数,则纯虚拟析构函数也必须有一个实现(尽管它可能不需要做任何事情;如果没有资源4可释放,则为空也可以)。

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

您的语法将是:

void abstractClass::nonAbstractMethod() {
     abstractMethod();
    /* ... */
}
所以它看起来是这样的:

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

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

也请注意,在C++中,要想用作基类的类的析构函数(像这个抽象类)应该总是有虚析构函数,以防它们通过指向基的指针或引用BASE销毁。p>


如果您在定义抽象类时选择使析构函数成为纯虚拟的函数,那么纯虚拟析构函数也必须有一个实现(尽管它可能不必做任何事情;如果没有可释放的资源,则可以为空)

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

您应该记住将
abstractClass
中的析构函数设置为虚拟,以便在通过
abstractClass
指针删除对象时调用适当的析构函数

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

这是面向对象编程101


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

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

您应该记住将
abstractClass
中的析构函数设置为虚拟,以便在通过
abstractClass
指针删除对象时调用适当的析构函数

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

这是面向对象编程101

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

我经常用java做这个,但是我没有发现C++中…… 关于你的问题,我有点不太明白。如果你知道如何用java来做这个,C++中的问题到底是什么?您需要做的就是添加一个虚拟析构函数,并考虑将抽象方法私有化(而不是像java那样保护)。 爪哇:

C++:

提示:在谷歌搜索“模板方法设计模式”或“非虚拟界面习惯用法”

我经常用java做这个,但是我没有发现C++中…… 关于你的问题,我有点不太明白。如果你知道如何用java来做这个,C++中的问题到底是什么?您需要做的就是添加一个虚拟析构函数,并考虑将抽象方法私有化(而不是像java那样保护)。 爪哇:

C++:


提示:在谷歌搜索“模板方法设计模式”或“非虚拟界面习惯用法”。

这只是一个谜题,还是你在尝试做什么?只是不要用类型名称限定它:
abstractMethod()只调用不带类名限定符的方法:
abstractMethod()无法调用抽象方法,因为它没有任何实现。你为什么需要这个?抽象方法应该怎么做?@AngeloDM:这只适用于构造函数和析构函数这只是一个谜,还是你在尝试做什么?只是不要用类型名限定它:
abstractMethod()只调用不带类名限定符的方法:
abstractMethod()无法调用抽象方法,因为它没有任何实现。你为什么需要这个?抽象方法应该怎么做?@AngeloDM:这只适用于构造函数和析构函数。最好添加一个关于构造函数/析构函数的句子。最好添加一个关于构造函数的句子/destructors@MooingDuck,我明白你的意思了吗?我有析构函数/构造器。我没有