【问题标题】:Create an abstract class without an abstract method创建一个没有抽象方法的抽象类
【发布时间】:2017-04-10 15:01:08
【问题描述】:

我有 3 个班级,A、B 和 C:

class A
{
/// Some Code
};

class B : public A
{
/// Some Code
};

class c : public B
{
/// Some Code
};

我想让 A 类和 B 类抽象类以防止创建它们的实例,但是这两个类都没有抽象方法。即使没有抽象方法,有没有办法使类抽象?

【问题讨论】:

  • 创建一个纯虚析构函数。或者只允许受保护的构造函数。
  • 您可能根本不需要类继承。请考虑 HAS-A 关系。

标签: c++ inheritance abstract-class virtual-functions pure-virtual


【解决方案1】:

奇怪的是,如果您将这些类用作示例代码中所示的基类,它们应该具有虚拟析构函数。而且因为析构函数是一种方法,所以你可以把它变成一个纯虚拟(“抽象”)析构函数,让类本身成为“抽象”。

请注意,仍然可以为纯虚方法提供实现,因此您可以使用以下代码:

class A
{
  public:
    virtual ~A() = 0; 

/// Some Code
};

class B : public A
{
  public:
    virtual ~B() = 0;

/// Some Code
};

class C : public B
{
  public:
    virtual ~C() = 0;

/// Some Code
};
A::~A()  { }
B::~B()  { }
C::~C()  { }

由于在销毁对象时总是会调用基类析构函数,因此您无需在派生类的析构函数中显式调用基类实现。

这应该会给你想要的效果。但是,我目前正在努力为此设计提出一个引人注目的应用程序。 C++ 中抽象类的全部目的是定义一个接口,除非定义了构成该接口的方法,否则您不能拥有接口。要么我不够聪明,要么你应该重新考虑你的设计。

【讨论】:

  • 你为什么把 C 的析构函数也做成纯虚函数?
  • 如果C 不应该是抽象的,则不需要纯虚拟。 @roey,您的问题并不清楚。虽然virtual 隐含在使用虚拟析构函数从基类继承时的析构函数,但为了清楚起见,我还是喜欢包含它。
猜你喜欢
  • 2011-07-10
  • 1970-01-01
  • 2011-06-16
  • 2020-03-12
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多