指向基类的唯一指针

Unique pointer to Base class

本文关键字:唯一 指针 基类      更新时间:2023-10-16

我有两个类,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>;

通过这两个修复,将显示的代码将编译。