【问题标题】:C++: How do I pass a derived object into a class that holds its abstract base? [duplicate]C++:如何将派生对象传递给包含其抽象基的类? [复制]
【发布时间】:2018-09-21 18:11:07
【问题描述】:

我有一个类,我想保存一个抽象类对象。

class myClass
{
abstractClass abstractObject; //won't work since abstractClass is abstract
// ....
}

其中abstractClass 是一个抽象基类。那么我可能有一个非抽象的derivedClass1derivedClass2,它们都继承自abstractClass。我想将这些派生类传递给myClass。如何使用右值来做到这一点?

我希望能够例如说

myClass someOBJ(derivedClass1(x, y, z));
myClass someOtherOBJ(derivedClass2(x,y,z));

然后这两个对象现在包含derivedClass1derivedClass2 类型的对象。

【问题讨论】:

  • 有什么问题?您是否尝试编写 myClass 的构造函数来接受这些派生类的对象?
  • 是的,但我不想在类外创建对象然后将它们传入。我想像右值一样同时创建它们。
  • 你应该使用抽象类的指针。

标签: c++ oop


【解决方案1】:

也许您应该使用指向对象的指针,例如abstractClass* ptr;,并编写一个接受右值的构造函数,例如myclass::myclass(abstractClass&& rval)

【讨论】:

  • 会检查它是否有效。
【解决方案2】:

如果要保留多态性,则需要在myClass 中使用指针或对abstractClass 的引用。

正确的 C++ 是通过使用std::unique_ptr<>

#include <memory>

class AbstractClass
{
public:
    virtual void func() = 0;
};


class DerivedClass : public AbstractClass
{
public:
    void func() {};
};


class myClass
{
    std::unique_ptr<AbstractClass> ptr;

public:
    myClass(AbstractClass* p) : ptr(p) {}
};


int main()
{
    myClass(new DerivedClass());

    return 0;

    //myClass will automatically call delete on the pointer
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多