2013-07-28 64 views
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是一个抽象类。我不明白UnionRegion的ctor如何接收Region类型的对象,因为我们如何创建一个抽象类的对象?

又是什么点举办shared_ptrRegion?我明白,因为Region是抽象的,我们需要一个指针,但Region甚至没有私人成员,所以基本上我无法对该指针做任何事情。

谢谢!

+0

但它需要一个**引用... **没有创建实际的实例,没有执行复制。该函数只需要传递任何具体的对象。 – 2013-07-28 07:23:48

+0

对象的引用不是一个对象。我一直认为引用只是荣耀的指针。 –

+0

@j_kubik这是错误的,引用不是指针,而引用**是**对象。 (它*完全*,它不是**拷贝**,而是对象本身。) – 2013-07-28 07:27:58

回答

0

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

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

将shared_ptr保存到Region是什么点?

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

需要协商的是:为什么你的UnionRegion是一个派生类型需要持有一个指针(shared_ptr)到它的基地?这更像是设计行为。

0

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

1

Region是一个抽象类,但它从未实例化。对const Region的引用绑定到Region的任何子类的对象(很像指向const Region的指针)。所以UnionRegion的构造函数引用了任何两个对象,即Region的子类。