基类指针指向派生类,基类和派生类谁的范围更大一些,为什么派生类对象能作为基类对象传实参
时间: 2023-08-23 17:27:37 浏览: 52
基类和派生类的范围是不同的。派生类是基类的扩展,具有基类的所有成员,同时还有自己的成员。因此,派生类的范围更大。
派生类的对象可以作为基类对象传递实参,是因为派生类对象可以被视为基类对象的一种特殊情况。由于派生类包含基类的所有成员,因此派生类对象可以转换为基类对象,而基类对象不具备派生类的特性,因此不能转换为派生类对象。
通过将派生类对象传递给基类对象的引用或指针,可以以基类的方式访问派生类的成员。这种方式称为向上转型。在程序中,向上转型可以实现多态性,使得基类指针或引用在运行时可以指向不同的派生类对象,从而实现了动态绑定。
相关问题
在调用一个形参类型为派生类引用的函数时,可以将一个基类对象作为实参
可以,但是需要注意的是,这个基类对象在传递给函数时会隐式地转换为派生类对象的引用。因此,函数中使用的是派生类对象的成员函数和数据成员。但是,如果派生类中新增了成员函数或数据成员,基类对象就无法访问这些新增的成员。同时,如果基类对象中的某些成员在派生类中被重定义,那么调用函数时会调用派生类中的函数,而不是基类中的函数。因此,在使用基类对象作为函数实参时,需要注意函数是否需要访问派生类中新增的成员或重定义的成员。
如果函数的参数是基类对象或基类对象的引用,函数调用时的实参可以是派生类对象。举个代码解释一下
当函数的参数是基类对象或基类对象的引用时,可以传入派生类对象作为参数,这是因为派生类继承了基类的所有成员,包括成员函数和成员变量,因此可以被当做基类对象来使用。以下是一个简单的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`,但是它可以指向一个派生类对象,并且可以调用派生类的成员函数。这也说明了可以将派生类对象当做基类对象来使用,这就是多态性的体现。