我有一个包含两个类的抽象类(一个抽象,一个非抽象)。 我想从非抽象方法调用抽象方法。
这就是我想要做的事情:
class abstractClass {
public:
virtual void abstractMethod() = 0 ;
void nonAbstractMethod();
}
in .cpp:
void abstractClass::nonAbstractMethod() {
abstractClass::abstractMethod();
/* ... */
}
是否可以在c ++中使用?
这里的问题是nonAbstracMethod不是静态的,所以我不能在没有对象实例的情况下调用它。但这是一个抽象的课程!我无法实例化它......我怎么能用这个来管理呢?
我经常在java中这样做,但我在c ++中找不到...
答案 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 ++中,请记住,打算用作基类的类的析构函数(如此抽象类)应始终具有虚拟析构函数,以防它们通过指向基类或引用方式销毁。基础。
如果你选择在构造抽象类时使析构函数成为纯虚拟的一个函数,那么纯虚析构函数也必须有一个实现(尽管它可能不需要做任何事情;如果有的话,空的很好没有资源可以发布。)