指向基类的唯一指针
Unique pointer to Base class
我有两个类,Base
包含虚拟方法,D
包含重载该方法。我想创建一个Base
类型的变量,而不是传递继承类Base
的类D
。这是我的实现:
#include <iostream>
#include <vector>
#include <memory>
#include <cstdio>
#include <fstream>
#include <cassert>
#include <functional>
class Base {
public:
virtual void bar() { std::cout << "B::barn"; }
//virtual ~Base() = default;
};
typedef Base* Maker();
Maker* arr[10];
class D : Base
{
public:
D() { std::cout << "D::Dn"; }
~D() { std::cout << "D::~Dn"; }
void bar() override { std::cout << "D::barn"; }
};
template <class T>
Base* make(){
return new T;
}
int main()
{
std::unique_ptr<Base> p1(new D);
p1->bar();
//arr[0] = make<D>();
return 0;
}
顺便说一句,它正在使用结构,但是当我尝试通过类实现它时,我会收到错误。
>D
私下继承自B
。因此,D*
不能转换为B*
。你可能想要class D : public Base { ... };
编译错误有两个原因,都必须修复。
class D : Base
Base
是私有继承的,因此只有D
的成员才能将指针转换为D
指向B
的指针,您必须公开继承:
class D : public Base
第二个问题在这里:
typedef Base* Maker();
Maker* arr[10];
// ...
arr[0] = make<D>();
arr
是一个函数指针数组。"Make((" 是一个表达式,其计算结果为返回Base *
的函数调用。将Base *
分配给某个函数指针没有任何意义。你的意思是:
arr[0] = &make<D>;
通过这两个修复,将显示的代码将编译。
相关文章:
- 何时在引用或唯一指针上使用移动语义
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 如何更改唯一指针向量的可见性
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- C++尝试深度复制唯一指针时出现内存访问冲突
- 使用 RTTI 克隆唯一指针的向量
- 为什么我无法创建唯一指针
- 如何将唯一指针的 std::vector 转换为原始指针的 std::span?
- 将唯一指针的指针传递给采用双指针的函数
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- C++唯一指针的向量
- 对带有唯一指针的 std::thread 使用类成员函数时出现编译错误
- 指向基类的唯一指针
- 添加要映射的对象的唯一指针
- 智能指针(唯一指针)和引用
- 唯一指针是否在堆或堆栈上分配内存?
- 尝试设置唯一指针布尔数组的值时BAD_ACCESS错误
- 使用唯一指针调用函数会使我的程序崩溃
- 将唯一指针插入std::映射