Polygon * ppoly1 = ▭ Polygon * ppoly2 = &trgl; Polygon * ppoly3 = &poly; ppoly1->set_values(5, 8); ppoly2->set_values(5, 8); ppoly3->set_values(5, 8); cout << ppoly1->area() <<" "<<rect.area()<< endl; cout << ppoly2->area() <<" "<<trgl.area()<< endl; cout << ppoly3->area() <<" "<<poly.area()<< endl;
时间: 2024-04-25 10:26:03 浏览: 5
这段代码是关于多态的示例。其中,rect、trgl和poly都是Polygon类的派生类。ppoly1、ppoly2和ppoly3是指向Polygon对象的指针,但是它们实际上指向的是rect、trgl和poly对象。当调用ppoly1、ppoly2和ppoly3的area()函数时,由于这些指针是指向不同的对象的,因此它们会调用不同的派生类的area()函数,从而产生不同的结果。这就是多态的实现方式。
需要注意的是,set_values()函数是在Polygon类中定义的,但是由于rect、trgl和poly都是Polygon类的派生类,它们都继承了set_values()函数。因此,当使用ppoly1、ppoly2和ppoly3指针调用set_values()函数时,它们会分别调用rect、trgl和poly对象的set_values()函数。
相关问题
Rectangle rect; Triangle trgl; Polygon poly; Polygon * ppoly1 = ▭ Polygon * ppoly2 = &trgl; Polygon * ppoly3 = &poly; ppoly1->set_values(5, 8); ppoly2->set_values(5, 8); ppoly3->set_values(5, 8); cout << ppoly1->area() <<" "<<rect.area()<< endl; cout << ppoly2->area() <<" "<<trgl.area()<< endl; cout << ppoly3->area() <<" "<<poly.area()<< endl; return 0;
这段代码也是关于多态的示例。其中,rect、trgl和poly都是Polygon类的派生类。ppoly1、ppoly2和ppoly3是指向Polygon对象的指针,但是它们实际上指向的是rect、trgl和poly对象。当调用ppoly1、ppoly2和ppoly3的area()函数时,由于这些指针是指向不同的对象的,因此它们会调用不同的派生类的area()函数,从而产生不同的结果。这就是多态的实现方式。
与上面的代码不同的是,这里没有给出set_values()函数的实现,因此无法确定rect、trgl和poly对象的属性值。但是,由于ppoly1、ppoly2和ppoly3是指向这些对象的指针,它们仍然可以调用派生类的area()函数,从而计算出这些对象的面积。
polygon1 - rect1.tl() 这里编译不过
`polygon1 - rect1.tl()` 这行代码的含义是将 `polygon1` 中所有顶点的坐标都减去 `rect1.tl()`,即左上角顶点的坐标,以将多边形的坐标系与矩形的坐标系对齐。
但是,`-` 运算符并不支持对 `std::vector<cv::Point>` 类型的向量进行操作,因此编译时会出错。
要对向量中的所有元素进行操作,可以使用 `std::transform` 函数。您可以将 `polygon1` 和 `rect1.tl()` 转换为 `cv::Point` 类型的向量,并使用 `std::transform` 对其进行操作,代码如下:
```
std::vector<cv::Point> shiftedPolygon1;
cv::Point shift = rect1.tl();
std::transform(polygon1.begin(), polygon1.end(), std::back_inserter(shiftedPolygon1),
[shift](const cv::Point& pt) { return pt - shift; });
cv::fillConvexPoly(intersectionMat, shiftedPolygon1, cv::Scalar(255));
```
这样,就可以将 `polygon1` 中所有顶点的坐标都减去 `rect1.tl()`,并将结果存储在 `shiftedPolygon1` 向量中。然后,使用 `shiftedPolygon1` 替换原来的 `polygon1`,即可完成计算。