Rectangle A(h,w); Circle B(r); Shape *p1, *p2; Shape &q1= A, &q2=B; p1 = &A; p2 = &B;讲解代码
时间: 2023-09-04 07:10:57 浏览: 90
这段代码定义了两个类 `Rectangle` 和 `Circle`,分别表示矩形和圆形,以及它们的对象 `A` 和 `B`。另外还定义了两个指向基类 `Shape` 的指针 `p1` 和 `p2`,以及两个基类 `Shape` 的引用 `q1` 和 `q2`,并将它们分别指向了 `A` 和 `B`。
从语法上来说,这里使用了对象的初始化列表来初始化 `Rectangle` 和 `Circle` 的成员变量。`Rectangle A(h,w)` 相当于定义了一个 `Rectangle` 类型的对象 `A`,并将其 `height` 和 `width` 成员变量分别初始化为 `h` 和 `w`;`Circle B(r)` 相当于定义了一个 `Circle` 类型的对象 `B`,并将其 `radius` 成员变量初始化为 `r`。
而 `Shape` 类则是这两个类的基类,可能是一个抽象类,具体实现并未给出。使用基类指针和引用来引用派生类对象是多态的一种体现,可以方便地实现动态绑定和多态调用。
相关问题
Shape* p1, * p2; p1 = &A; p2 = &B; cout << "基类指针指向Rectangle类对象,调用calArea():" << p1->Shape::calArea() << endl; cout << "基类指针指向Circle类对象,调用calArea():" << p2->Shape::calArea() << endl; Shape& r1 = A; cout << "Rectangle类对象初始化基类对象引用r,r调用calArea():" << r1.Shape::calArea() << endl; Shape& r = B; cout << "Circle类对象初始化基类对象引用r,r调用calArea():" << r.Shape::calArea() << endl; return 0;为什么不纯在二义性
在这段代码中,没有出现二义性,因为所有派生类都实现了基类的虚函数 `calArea()`,因此通过基类指针或引用调用时,会根据指针或引用所指向的具体对象类型,调用相应的实现。同时,在这段代码中,基类的虚函数 `calArea()` 已经被声明为虚函数,因此可以保证在运行时进行动态绑定,调用正确的实现。
#include<iostream> using namespace std; class Shape { public: double calArea() { return 0; } }; class Rectangle :public Shape { private: double wide, high; public: Rectangle(double a, double b) { wide = a; high = b; } double calArea() { return wide * high; } }; class Circle :public Shape { private: double R; public: Circle(double a) { R = a; } double calArea() { return 3.1415926 * R * R; } }; int main() { double a, b, c; cin >> a >> b >> c; Rectangle A(a, b); Circle B(c); cout << "通过Rectangle类对象调用calArea():" << A.Rectangle::calArea() << endl; cout << "通过Circle类对象调用calArea():" << B.Circle::calArea() << endl; Shape* p1, * p2; p1 = &A; p2 = &B; cout << "基类指针指向Rectangle类对象,调用calArea():" << p1->Shape::calArea() << endl; cout << "基类指针指向Circle类对象,调用calArea():" << p2->Shape::calArea() << endl; Shape& r1 = A; cout << "Rectangle类对象初始化基类对象引用r,r调用calArea():" << r1.Shape::calArea() << endl; Shape& r = B; cout << "Circle类对象初始化基类对象引用r,r调用calArea():" << r.Shape::calArea() << endl; return 0; }其中calArea函数不纯在二义性吗
在这个程序中,calArea函数不存在二义性。这是因为该程序中的Rectangle类和Circle类都是Shape类的派生类,并且在这两个派生类中,都重写了Shape类中的calArea函数。因此,通过Rectangle类对象调用calArea函数时,会调用Rectangle类中的calArea函数;通过Circle类对象调用calArea函数时,会调用Circle类中的calArea函数。而通过基类指针或基类引用调用calArea函数时,由于指针或引用指向的是具体的派生类对象,因此也会调用相应的派生类中的calArea函数。因此,calArea函数不存在二义性。