我有以下代码:
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_ptr
到Region
的重点是什么?我理解,因为Region
是抽象的,我们需要一个指针,但Region
甚至没有私有成员,所以基本上我对该指针无能为力。
谢谢!
答案 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)到它的基础?这更像是设计行为。