2

我有以下代码:

class Region {
public:
    virtual Region* clone() const = 0;
    virtual ~Region() {}
    bool contains(double x, double y) const = 0;
}

class UnionRegion : public Region {
    shared_ptr<Region> r1;
    shared_ptr<Region> r2;
public:
    UnionRegion(const Region& r1, const Region& r2) :
           r1(r1.clone()), r2(r2.clone()) {}
    .
    .
    .
}

Region是一个抽象类。我不明白 ctor 是UnionRegion如何接收类型对象的Region,因为我们如何创建抽象类的对象?

持有 a shared_ptrto又有什么意义Region呢?我知道因为Region是抽象的,我们需要一个指针,但Region甚至没有私有成员,所以基本上我不能用那个指针做任何事情。

谢谢!

4

3 回答 3

1

Region是一个抽象类,但它从未被实例化。一个对const Region绑定到任何子类的对象的引用Region(就像一个指向const Region会的指针)。SoUnionRegion的构造函数采用对任何两个作为子类的对象的引用Region

于 2013-07-28T07:34:44.407 回答
0

由于UnionRegion继承自可以使用其他参数或任何其他继承自Region的类类型调用。由于这是一个构造函数,我假设可能还有一些其他类类型继承自并用于构造.UnionRegion(const Region& r1, const Region& r2)UnionRegionRegionRegionUnionRegion

于 2013-07-28T07:26:48.083 回答
0

我们如何创建抽象类的对象?

不能创建抽象类的对象,只能使用抽象类引用/指针来引用派生的具体类对象。

将 shared_ptr 保存到 Region 有什么意义?

如果你想要一个具体类型未知的类成员,你必须使用指针或引用来保存它。然后稍后您可以调用覆盖虚函数来进行多态操作。

需要协商的是:为什么作为派生类型的 UnionRegion 需要持有指向其基的指针(shared_ptr)?它更像是设计行为。

于 2013-07-28T07:40:22.983 回答