通过基类shape对象的引用调用虚函数area()来实现多态性。c++
时间: 2024-02-26 21:54:41 浏览: 112
是的,C++中的多态性可以通过基类的指针或引用调用虚函数来实现。具体来说,在基类中声明一个虚函数,派生类可以覆盖该函数,使得在通过基类指针或引用调用该函数时,实际执行的是派生类中的函数。这样就可以实现多态性,即同一函数在不同情况下表现出不同的行为。例如,如果定义一个Shape基类,其中包含虚函数area(),然后派生出Rectangle和Circle类并分别重载area()函数,那么通过Shape类的指针或引用调用area()函数时,实际执行的是Rectangle或Circle类中的函数,具体取决于指针或引用所指向的对象类型。
相关问题
如果函数的参数是基类对象或基类对象的引用,函数调用时的实参可以是派生类对象。举个代码解释一下
当函数的参数是基类对象或基类对象的引用时,可以传入派生类对象作为参数,这是因为派生类继承了基类的所有成员,包括成员函数和成员变量,因此可以被当做基类对象来使用。以下是一个简单的C++代码示例:
```cpp
#include <iostream>
using namespace std;
class Shape {
protected:
int width, height;
public:
Shape( int a = 0, int b = 0) {
width = a;
height = b;
}
virtual int area() {
cout << "Parent class area :" <<endl;
return 0;
}
};
class Rectangle: public Shape {
public:
Rectangle( int a = 0, int b = 0):Shape(a, b) { }
int area () {
cout << "Rectangle class area :" <<endl;
return (width * height);
}
};
int main( ) {
Shape *shape;
Rectangle rec(10,7);
shape = &rec;
// 调用 Rectangle 的 area 函数
shape->area();
return 0;
}
```
在上面的代码中,首先定义了一个基类 `Shape`,其中包含了一个 `area()` 函数,然后定义了一个派生类 `Rectangle`,重写了 `area()` 函数,并且在其中输出了一个字符串 "Rectangle class area :",最后在 `main()` 函数中,定义了一个 `Shape` 指针 `shape` 和一个 `Rectangle` 对象 `rec`,并且将 `rec` 的地址赋给了 `shape`,然后通过调用 `shape->area()` 函数来调用 `Rectangle` 类的 `area()` 函数。因为 `shape` 指向的是一个 `Rectangle` 对象,所以最终输出的结果是 "Rectangle class area :"。
可以看到,尽管 `shape` 的类型是 `Shape`,但是它可以指向一个派生类对象,并且可以调用派生类的成员函数。这也说明了可以将派生类对象当做基类对象来使用,这就是多态性的体现。
定义一个Shape基类,其中包含纯虚函数GetArea(),在此基础上派生出Retangle和Circle类,二者都实现虚函数GetArea()的实现(计算对象面积)。在main函数中,使用Retangle和Circle类创建对象r和c,定义父类指针变量指向子类对象,调用GetArea()函数实现多态。(p=3.14)
下面是实现上述功能的示例代码:
```c++
#include <iostream>
using namespace std;
const double p = 3.14; // 定义常量p
class Shape {
public:
virtual double GetArea() = 0; // 声明纯虚函数GetArea()
};
class Rectangle : public Shape {
public:
Rectangle(double w, double h) : width(w), height(h) {}
double GetArea() override { // 实现GetArea()函数
return width * height;
}
private:
double width;
double height;
};
class Circle : public Shape {
public:
Circle(double r) : radius(r) {}
double GetArea() override { // 实现GetArea()函数
return p * radius * radius;
}
private:
double radius;
};
int main() {
Shape* pShape = nullptr;
Rectangle r(3, 4);
Circle c(2);
pShape = &r;
cout << "Rectangle area: " << pShape->GetArea() << endl;
pShape = &c;
cout << "Circle area: " << pShape->GetArea() << endl;
return 0;
}
```
输出结果为:
```
Rectangle area: 12
Circle area: 12.56
```
可以看到,通过多态性,父类指针变量pShape指向子类对象r和c,并调用了它们各自的GetArea()函数,输出了对应的面积值。
阅读全文