【问题标题】:Inheritance from a pure abstract class without default constructor从没有默认构造函数的纯抽象类继承
【发布时间】:2015-12-10 00:09:18
【问题描述】:

我有一个预定义的纯抽象类,我不想碰它。声明如下:

class A {
public:
  inline virtual ~A();
  A(const A&);
  A operator=(const A&);
  virtual void someMethod();
};

该类没有成员变量并且这些函数都没有任何实现,因此它应该等于:virtual void someMethod() = 0;。 我想在自己的类中实现这个纯抽象类(因为我需要添加成员变量来实现函数someMethod())而不改变class A的声明,但是有两个问题:

1.) class A 没有默认构造函数,只有声明的复制构造函数和赋值运算符。所以我将无法从我的子类创建实例,因为A::A: no appropriate default constructor available

2.) 即使假设 class A 将声明和定义一个默认构造函数(如果我将 A(){} 添加到类声明中),我会得到 2 个链接器错误,用于 someMethod() 和来自 class A 的析构函数。

我自己的代码如下:

#include <memory>

class B : public virtual A {
public:
  B() {}
  inline virtual ~B() {}
  B(const B&) {}
  virtual void someMethod() override {}
};

int main(int argc, char*argv[]) {
  auto object = std::make_unique<B>(B());
  return 0;
}

任何建议我在这里做错了什么?

【问题讨论】:

  • A 不是抽象类,因为virtual void someMethod();
  • A 不可能创建任何实例,因为它没有构造函数,除了一个接受另一个 A 的构造函数。因此,如果您想实际使用它,则必须进行更改。我推荐struct A { virtual void someMethod() = 0; virtual ~A(); }
  • "所以它应该等于:virtual void someMethod() = 0;" 但事实并非如此。如果你想让它抽象,你需要=0
  • A 坏了。你必须改变它。它的赋值运算符也是错误的。
  • @M.M 我还推荐一个虚拟析构函数。

标签: c++ inheritance pure-virtual


【解决方案1】:

正如 cmets 中的人所说,A 是一个不可能的课程。就目前而言,您只能使用预先存在的A 创建一个新的A,因此没有定义创建A 的方法。我建议删除复制构造函数声明(如果你在某处提供了定义)。您也可以删除赋值运算符,除非实际上有它的定义。由于A 没有字段,您不妨将析构函数设为纯虚拟(请参阅this 关于纯虚拟析构函数的回答)。

virtual ~A() = 0;
//outside class definition
inline A::~A() {}

如果A 没有功能可包含在some_method 中,则将其设为纯虚拟:

virtual void some_method() = 0;

还有关于你的班级:

class B : public virtual A

我认为您不需要A 作为虚拟基地。在这种情况下,虚拟意味着如果另一个类同时继承了AB,那么它将只有A 的一个副本。这些更改应该使一切正常。

【讨论】:

    猜你喜欢
    • 2014-04-30
    • 2011-04-12
    • 2017-10-04
    • 2016-03-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 2011-11-17
    相关资源
    最近更新 更多