Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 抽象类c++;作为函数的参数_C++_Inheritance_Abstract Class - Fatal编程技术网

C++ 抽象类c++;作为函数的参数

C++ 抽象类c++;作为函数的参数,c++,inheritance,abstract-class,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; p

我有以下代码:

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()) {}
    .
    .
    .
}
类区域{
公众:
虚拟区域*clone()常量=0;
虚拟~Region(){}
布尔包含(双x,双y)常数=0;
}
类别:公共区域{
共享的ptr r1;
共享的ptr r2;
公众:
联合区域(常量区域和r1、常量区域和r2):
r1(r1.clone()),r2(r2.clone()){}
.
.
.
}

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

另外,将
共享的\u ptr
保存到
区域有什么意义?我理解,因为
Region
是抽象的,我们需要一个指针,但是
Region
甚至没有私有成员,所以基本上我对这个指针无能为力


谢谢

由于
UnionRegion
继承自
Region
UnionRegion(const Region&r1,const Region&r2)
可以使用其他
UnionRegion
参数或继承自
Region
的任何其他类类型调用。由于这是一个构造函数,我假设可能还有其他一些类类型继承自
Region
,用于构造
UnionRegion
Region
是一个抽象类,但它从未被实例化。对
const Region
的引用绑定到
Region
的任何子类的对象(就像指向
const Region
的指针一样)。因此,
UnionRegion
的构造函数引用属于
Region
子类的任意两个对象

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

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

对区域进行共享的ptr有什么意义

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


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

但它需要一个参考。。。不创建实际实例,不执行复制。函数只接受它传递的任何具体对象。对对象的引用不是对象。我一直认为引用只是美化的指针。@j_kubik这是错误的,引用不是指针,引用就是对象。(确切地说,它不是副本,而是对象本身。)@H2CO3我知道它是-但它甚至不需要完全定义类型来使用它。在大多数情况下,若您可以使用指向它的指针,那个么您也可以对它进行引用。由于指针是引用的最典型的实现,区别(虽然存在)并没有那么大。@j_kubik对于您描述的行为,更精确的命名应该是“在某些方面,引用具有类似指针的语义”。