[英]Compile error associated with std::unique_ptr and abstract classes
我有从基础 class 继承的 class。 基础 class 包含在派生的 class 中重写的纯虚函数。 我用派生的 class 的 std::unique_ptr 实例化基础 class object 但得到编译时错误
class Base {
public:
~Base () = default;
initBase () { count = 0; }
virtual void method1() = 0;
virtual void method2() = 0;
private:
int count;
};
class Child final : public Base {
public:
Child() = default;
~Child() = default;
void method1() override { std::cout << "B Running method 1\n"; }
void method2() override { std::cout << "B Running method 2\n"; }
};
class myClass {
public:
myClass(std::unique_ptr<Base> base) { _base(std::move(base)) };
~myClass() = default();
private:
std::unique_ptr<Base> _base;
};
int main() {
myClass obj = myClass(std::make_unique<Child>());
}
编译器给出以下错误:
error: invalid new-expression of abstract class type 'Base'
{ return unique_ptr<_Tp>(new _Tp(std::forward<_Args>(__args)...)); }
because the following virtual functions are pure within 'Base':
class A {
'virtual void Base::method1()'
virtual void method1() = 0;
'virtual void Base::method2()'
virtual void method2() = 0;
您的代码中有几个拼写错误:
在Base
:
改变
initBase () { count = 0; }
至
Base () { count = 0; }
在Child
中:
改变
myClass(std::unique_ptr<Base> base) { _base(std::move(base)) };
至
myClass(std::unique_ptr<Base> base): _base(std::move(base)) { }
改变
~myClass() = default();
至
~myClass() = default;
在main()
中:
改变
myClass obj = myClass(std::make_unique<Child>());
至
myClass obj(std::make_unique<Child>());
#include <iostream>
#include <memory>
class Base {
public:
~Base () = default;
Base () { count = 0; }
virtual void method1() = 0;
virtual void method2() = 0;
private:
int count;
};
class Child final : public Base {
public:
Child() = default;
~Child() = default;
void method1() override { std::cout << "B Running method 1\n"; }
void method2() override { std::cout << "B Running method 2\n"; }
};
class myClass {
public:
myClass(std::unique_ptr<Base> base) : _base(std::move(base)) { }
~myClass() = default;
private:
std::unique_ptr<Base> _base;
};
int main() {
myClass obj(std::make_unique<Child>());
std::cout << "OK";
}
有了这些修复,代码就可以正常编译了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.