我想使用纯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; }
}
然后,我怎么能用它?
答案 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