从没有默认构造函数的纯抽象 class 继承

Inheritance from a pure abstract class without default constructor

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

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

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

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

2.) 即使假设 class A 会声明和定义默认构造函数(如果我将 A(){} 添加到 class 声明),我会得到 2 个链接器错误class A.

中的 someMethod() 和析构函数

我自己的代码如下:

#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 是不可能的 class。目前,您只能使用预先存在的 A 创建新的 A,因此没有定义的方法来创建 A。我建议删除复制构造函数声明(以及定义,如果您在某处提供的话)。您也可以删除赋值运算符,除非它确实有定义。由于 A 没有字段,您不妨将析构函数设为纯虚拟(参见 this 关于纯虚拟析构函数的回答)。

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

如果 A 没有要包含在 some_method 中的功能,只需将其设为纯虚拟即可:

virtual void some_method() = 0;

还有关于你的 class:

class B : public virtual A

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