抽象类的对象c ++作为函数的参数

时间:2013-07-28 07:19:38

标签: c++ inheritance abstract-class

我有以下代码:

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甚至没有私有成员,所以基本上我对该指针无能为力。

谢谢!

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

  

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

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

  

将shared_ptr保存到Region是什么意思?

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

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