📜  指向派生类对象的基类指针(1)

📅  最后修改于: 2023-12-03 15:10:08.020000             🧑  作者: Mango

指向派生类对象的基类指针

在面向对象的程序设计中,经常会存在基类和派生类的关系。有时候我们需要在编写代码时使用基类指针来访问派生类对象。这篇文章将介绍如何使用指向派生类对象的基类指针。

什么是基类和派生类

在C++中,我们可以使用继承的方式创建基类和派生类。基类包含了所有派生类的共同特征,派生类可以继承基类,并且可以添加自己的特征。

我们可以通过下面的代码来创建基类和派生类:

class Base {
public:
    int x;
    void print() {
        std::cout << "Base: " << x << std::endl;
    }
};

class Derived : public Base {
public:
    int y;
    void print() {
        std::cout << "Derived: " << x << ", " << y << std::endl;
    }
};

在上面的代码中,Base是基类,Derived是派生类。派生类Derived继承了基类Base的公共成员x,并且添加了自己的成员y。同时,派生类Derived还覆盖了基类Base的成员函数print(),使其可以输出Derived对象的信息。

如何使用基类指针访问派生类对象

使用基类指针访问派生类对象非常常见。下面是一个例子,展示了如何使用基类指针访问派生类对象的成员函数和成员变量:

void print(Base* p) {
    p->print(); // 调用基类的 print 函数
    if (Derived* q = dynamic_cast<Derived*>(p)) {
        std::cout << "Derived: " << q->y << std::endl; // 访问派生类的 y 成员
    }
}

int main() {
    Base b;
    Derived d;
    
    b.x = 1;
    d.x = 2;
    d.y = 3;
    
    print(&b); // 输出 Base: 1
    print(&d); // 输出 Derived: 2, 3
    
    return 0;
}

在上面的代码中,我们定义了一个函数print(),它的参数是一个基类指针p。如果指针p指向的对象是派生类Derived的对象,就将指针p转换为派生类指针q,并且输出派生类对象的成员变量y。否则,就输出基类对象的信息。

print()函数中,我们使用了dynamic_cast运算符将基类指针p转换为派生类指针q。如果p指向的对象不是Derived的对象,dynamic_cast会返回一个空指针,我们可以用if语句判断是否转换成功。

总结

本文介绍了如何使用指向派生类对象的基类指针。希望对你学习面向对象的程序设计有所帮助。