是否有一种方法使用预先存在的对象作为C++中第一个对象的子对象来创建对象?

是否有一种方法使用预先存在的对象作为C++中第一个对象的子对象来创建对象?,c++,class,object,inheritance,nested,C++,Class,Object,Inheritance,Nested,所以,假设我们有类父类,以及从类父类继承的类子类。据我所知,当我创建子对象时,父对象也会被创建并与子对象关联。问题是,如果我已经创建了一个独立的父对象,我可以在创建时将其用作子对象中包含的父对象吗 也就是说,是否可以不在子对象中创建新的父对象,而在其位置使用原始和独立对象?仅仅将原始父对象的数据复制到在子对象中创建的对象上显然不是我想要的。可以这样做。如果父级具有移动构造函数,则可以编写如下内容: class Offspring : public Parent { double m_x;

所以,假设我们有类父类,以及从类父类继承的类子类。据我所知,当我创建子对象时,父对象也会被创建并与子对象关联。问题是,如果我已经创建了一个独立的父对象,我可以在创建时将其用作子对象中包含的父对象吗


也就是说,是否可以不在子对象中创建新的父对象,而在其位置使用原始和独立对象?仅仅将原始父对象的数据复制到在子对象中创建的对象上显然不是我想要的。

可以这样做。如果父级具有移动构造函数,则可以编写如下内容:

class Offspring : public Parent {
  double m_x;
 public:
  Offspring(Parent && p, double x)
      : Parent(std::move(p))
      , m_x(x) 
  { }
}
我认为这是你在不做任何危险和粗略的事情的情况下所能做到的最接近的。虽然这种技术可能无法避免复制父级的数据,但它可以更加高效。例如,如果父对象是std::vector,那么上面的代码将通过从现有向量移动来初始化子对象的基。这将需要只移动24字节的数据,而不是向量指向的所有数据


我认为您可能需要阅读以上移动语义的更多内容,看看它如何适合您的类。

我相信您想要的是能够将现有父实例与多个子实例一起使用。我这样说,是因为你似乎对抄袭感兴趣,而抄袭通常不应该引起关注

您可以将父级定义为纯接口,并将接口本身的实现定义为表示独立的父级

struct Parent {
    virtual ~Parent () = default;
    virtual void foo () = 0;
    //...
};

class Mother : public Parent {
public:
    void foo () { /* ... */ }
    //...
};
然后,您的后代可以接受父代来委托实现

class Offspring : public Parent {
    Parent &p_;
public:
    Offspring (Parent &p) : p_(p) {}
    void foo () { p_.foo(); }
    //...
};
所以现在,母亲可以是多个后代的父母


只有当父级实际上是一个接口时,这才有意义。然后ParentImpl可以实现接口并具有状态。然后,子对象可以使用提供的ParentImpl实现父接口。您可以尝试让子对象在其构造函数中对父对象进行右值引用,这个问题的存在表明,在这种情况下,组合依赖注入比继承更好。这种情况经常发生……我认为从父母那里获得后代是毫无意义的。子代应该包含一个指向单独父对象的指针/引用。@RemyLebeau:没有理由子代不能同时是父对象。相同的原理适用于复制构造函数而不是移动构造函数。这与复制数据并销毁原始数据是一样的。当然,没有其他选择在这种情况下,我根本不会从父母那里获得后代。@RemyLebeau:从功能的角度来看,我同意。但是从一个对象关系模型来看,没有理由后代不能成为父类。我同意,如果父类被定义为一个抽象接口而不是它自己的一个具体类,是的。@RemyLebeau:我的回答文本应该清楚地表明父类应该是一个纯接口。我不确定这是否是问题所问的,但无论如何,我都不会推荐一个相对初学者以这种方式编写代码。这是一个等待发生的悬而未决的参考,只有在特殊情况下才有理由。也许用共享指针代替?
Mother m;
Offspring o1(m);
Offspring o2(m);