C++ 指向基类的唯一指针

C++ 指向基类的唯一指针,c++,oop,inheritance,overloading,unique-ptr,C++,Oop,Inheritance,Overloading,Unique Ptr,我有两个类,Base包含虚方法,D包含重载该方法。我想创建一个基类类型的变量,然后将继承基类的类D传递给它。这是我的实现: #include <iostream> #include <vector> #include <memory> #include <cstdio> #include <fstream> #include <cassert> #include <functional> class Base

我有两个类,Base包含虚方法,D包含重载该方法。我想创建一个基类类型的变量,然后将继承基类的类D传递给它。这是我的实现:

#include <iostream>
#include <vector>
#include <memory>
#include <cstdio>
#include <fstream>
#include <cassert>
#include <functional>


class Base {
public:
  virtual void bar() { std::cout << "B::bar\n"; }
  //virtual ~Base() = default;
};

typedef Base* Maker();
Maker* arr[10];

class D : Base
{
public:
    D() { std::cout << "D::D\n";  }
    ~D() { std::cout << "D::~D\n";  }
    void bar() override { std::cout << "D::bar\n";  }
};

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*。您可能需要类D:公共基{…}

D私下从B继承。因此,D*不能转换为B*。您可能需要类D:公共基{…}

编译错误有两个原因,必须修复这两个原因

class D : Base
Base是私有继承的,因此只有D的成员才能将指向D的指针转换为指向B的指针,您必须公开继承:

class D : public Base
第二个问题是:

typedef Base* Maker();

Maker* arr[10];

// ...

arr[0] = make<D>();

使用这两个修复程序,显示的代码都可以编译。

编译错误有两个原因,必须修复这两个原因

class D : Base
Base是私有继承的,因此只有D的成员才能将指向D的指针转换为指向B的指针,您必须公开继承:

class D : public Base
第二个问题是:

typedef Base* Maker();

Maker* arr[10];

// ...

arr[0] = make<D>();

使用这两个修复程序,显示的代码可以编译。

结构是类!你的访问级别搞错了吗?是的,我搞错了:Base,当我应该使用:public Base时,因为我需要公共元素。结构是类!你的访问级别有错误吗?是的,我有:Base,当我应该使用:public Base时,因为我需要public元素。尝试取消注释被注释掉的行,因为它会导致编译错误,这是问题的主题,然后重试。顺便说一句,它与结构一起工作似乎注释掉的行不是今天向我们提出的问题的一部分。请尝试取消注释注释掉的行,因为它会导致编译错误,这是问题的主题,然后重试。顺便说一句,它与structs一起工作似乎注释掉的行不是今天向我们提出的问题的一部分。是的,我更改了它,它工作了。然而,当我尝试这样做时:D*d1=新的D;std::向量对象;object.push_back1;我会得到错误。。。我可以在std::vector中使用std::unique\u ptr吗?将其设为object.emplace\u backd1@lostsky25是的,您可以在向量中使用unique_ptr。将智能指针存储在容器中是发明unique_ptr、shared_ptr和move语义的主要原因之一,因为auto_ptr不能在容器中使用containers@IgorTandetnik注意object.emplace_backd1;如果炮台返回,将泄漏d1。更安全的做法是先将d1包装在唯一的_ptr中,然后将其移动到向量中。是的,我换了,它在工作。然而,当我尝试这样做时:D*d1=新的D;std::向量对象;object.push_back1;我会得到错误。。。我可以在std::vector中使用std::unique\u ptr吗?将其设为object.emplace\u backd1@lostsky25是的,您可以在向量中使用unique_ptr。将智能指针存储在容器中是发明unique_ptr、shared_ptr和move语义的主要原因之一,因为auto_ptr不能在容器中使用containers@IgorTandetnik注意object.emplace_backd1;如果炮台返回,将泄漏d1。更安全的做法是先将d1包装在唯一的_ptr中,然后将其移动到向量中。