【发布时间】: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