基类的指针

基类的指针指向它派生出来的子类实例时,可以用这个指针来操作这个子类实例。由于子类可以继承基类的成员函数和数据成员,因此这个指针可以访问基类和子类共有的成员函数和数据成员,但不能访问子类独有的成员函数和数据成员。

基类的指针的常见用法之一是在面向对象编程中实现多态。在多态中,基类的指针可用来访问派生类对象,使代码更灵活、通用、可扩展。通过使用指向基类的指针,可以让程序更具有可扩展性和维护性。

以下是一个简单的基类指针示例:

class Shape {
public:
    virtual double area() const { return 0; }  // 基类函数,可被子类覆盖
};

class Circle : public Shape {
public:
    Circle(double r) : radius(r) {}
    virtual double area() const override { return 3.14*radius*radius; }  // 子类覆盖了基类的area函数,实现了多态
private:
    double radius;
};

class Rectangle : public Shape {
public:
    Rectangle(double w, double h) : width(w), height(h) {}
    virtual double area() const override { return width*height; }  // 子类覆盖了基类的area函数,实现了多态
private:
    double width;
    double height;
};

int main() {
    Shape* shape1 = new Circle(5.0);  // 基类指针可以指向派生类对象
    Shape* shape2 = new Rectangle(3.0, 4.0);
    std::cout << "circle area = " << shape1->area() << std::endl;  // 输出 Circle::area()
    std::cout << "rectangle area = " << shape2->area() << std::endl; // 输出 Rectangle::area()
    return 0;
}

在上面的示例代码中,定义了一个基类Shape和派生类Circle和Rectangle。基类Shape中包含了一个名为area的虚函数,可以被子类覆盖。在主函数中,首先使用基类指针shape1和shape2分别指向派生类的对象Circle和Rectangle。然后通过shape1->area()和shape2->area()调用基类Shape中的area虚函数,实现了多态。根据不同的实例类型,进行了不同的计算,最终输出圆的面积和矩形的面积。

需要注意的是,基类指针在使用时需要注意记得用虚函数实现多态,即将基类函数声明为虚函数,并在派生类中进行正确的重载。否则,基类指针只能访问基类中的成员函数和数据成员,不能访问子类的成员函数和数据成员,失去多态性的优势。