【问题标题】:How to override a virtual function of an Abstract class calling another abstract class如何覆盖调用另一个抽象类的抽象类的虚函数
【发布时间】:2023-04-04 21:25:01
【问题描述】:

我有一个关于抽象类和纯虚函数的问题,当我尝试使用一个抽象类时,我发现纯虚函数返回另一个抽象类的实例,代码是这样的:

 class A{
    virtual B *newB()=0;    
    }

B类太抽象了:

class B{
virtual void function1()=0;
virtual void function2()=0;    
}

然后我有我的头文件 C.hpp,我在其中调用 A 类:

class C: A{
virtual B *newB();    
}

在我的 C.cpp 文件中,我输入了我的代码:

#include "C.hpp"
 B *C::newB(){
return new B;
}

它不能返回 B 的实例,因为它太抽象了。那么我该如何着手解决这个问题,我建议创建另一个继承自 B 的类并覆盖 function1 和 function2,之后我可以调用这个 new D() 而不是 new B() 你对这个解决方案有什么看法谢谢任何回应。

【问题讨论】:

  • 如果没有从每个抽象类派生的具体类,您将无能为力 - 您期望什么?

标签: c++ class abstract virtual-functions


【解决方案1】:

为什么你会得到一个成员函数newD?您可以简单地使用:

B* C::newB() {
  return new D; // D* converts to B*, if B is a public base class of D
}

您可能想回忆一下虚函数和抽象类的用途。它们提供了隐藏实现差异的接口。 C::newB 的调用者只关心一件事:我可以像 B 一样使用的对象。 C 类决定调用者获得的接口实现。这通常称为Factory Pattern

【讨论】:

    【解决方案2】:

    问题不是“回归”,而是“新B”。你不能“新建”一个抽象类。您必须实例化一个派生自 B 的具体类。然后您可以愉快地将其作为指向 B 的指针返回。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多