从没有默认构造函数的纯抽象 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 继承了 A
和 B
,它将只有一个 A
的副本。这些更改应该会使一切正常。
我有一个预定义的纯抽象 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
.
我自己的代码如下:
#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 继承了 A
和 B
,它将只有一个 A
的副本。这些更改应该会使一切正常。