使用纯抽象数据类型作为回报?

时间:2017-12-24 03:39:50

标签: c++ c++11

我想使用纯ADT作为返回参数,如(摘要):

class PADT {
public:
   virtual ADT func() = 0;
   virtual int iFun() = 0;
}

class X : PADT {
public:
   virtual PADT func() { return X(); }
   virtual int iFun()  { return 1; }
}

Class Y : PADT {
public:
   virtual PADT func() { return Y(); }
   virtual int iFun()  { return 2; }
}

然后,我怎么能用它?

2 个答案:

答案 0 :(得分:3)

在C ++中,值有修复类型;他们不能(直接)使用C ++的内置OO运行时多态性。

现在您可以在C ++中实现运行时值多态类型,例如std函数,但它们不会(直接)使用C ++面向对象的系统。 Std函数的operator(),复制,移动和销毁操作在运行时都是多态的;它们都不是virtual

如果您想要这种多态性,请查看如何实现std函数。如果你想使用C ++内置虚拟方法,可以找出如何返回智能指针并使用它们。

答案 1 :(得分:0)

为了使多态在C++中起作用,您必须使用指针引用

通常使用智能指针来管理动态对象,例如std::unique_ptr。这会在指针超出范围时自动删除对象,因此您无需记住这样做。

这样的事情:

class PADT {
public:
    // return a pointer (pref a unique_ptr)
    virtual std::unique_ptr<PADT> func() = 0;
    virtual int iFun() = 0;
};

class X : public PADT {
public:
    virtual std::unique_ptr<PADT> func() { return std::make_unique<X>(); }
    virtual int iFun()  { return 1; }
};

class Y : public PADT {
public:
    virtual std::unique_ptr<PADT> func() { return std::make_unique<Y>(); }
    virtual int iFun()  { return 2; }
};

int main()
{
    X x; // an x
    Y y; // a y

    std::unique_ptr<PADT> padt = x.func();

    std::cout << "x: " << padt->iFun() << '\n';

    padt = y.func();

    std::cout << "y: " << padt->iFun() << '\n';
}

<强>输出:

x: 1
y: 2