Loading

子类指针指向子类对象,如何调用父类属性方法

在C++中,当子类指针指向子类对象时,可以通过以下方式调用父类的属性和方法:

1. 调用父类的公有方法

  • 直接使用子类指针调用父类的公有方法,包括被重写的方法。
  • 如果子类没有重写该方法,将直接调用父类的实现。
  • 如果子类重写了该方法,默认调用子类的版本(静态绑定),除非通过父类名::方法名()显式指定。

2. 访问父类的公有/保护属性

  • 父类的公有属性可以直接通过子类指针访问。
  • 父类的保护属性(protected)也可以被访问(因为子类继承了这些属性)。

示例代码

以下是一个完整的示例,展示了子类指针如何调用父类的方法和属性:

#include <iostream>
using namespace std;

class Parent {
public:
    int publicVar = 10;       // 公有属性
protected:
    int protectedVar = 20;    // 保护属性
private:
    int privateVar = 30;      // 私有属性(子类无法直接访问)
public:
    void publicMethod() {     // 公有方法
        cout << "Parent::publicMethod()" << endl;
    }
    virtual void virtualMethod() {  // 虚方法
        cout << "Parent::virtualMethod()" << endl;
    }
};

class Child : public Parent {
public:
    int childVar = 100;
    void childMethod() {
        cout << "Child::childMethod()" << endl;
        // 子类内部可以直接访问父类的protected属性
        cout << "Accessing protectedVar from child: " << protectedVar << endl;
    }
    // 重写父类的虚方法
    void virtualMethod() override {
        cout << "Child::virtualMethod()" << endl;
    }
};

int main() {
    Child* childPtr = new Child();

    // 1. 调用父类的公有方法
    childPtr->publicMethod();          // 输出: Parent::publicMethod()
    childPtr->virtualMethod();         // 输出: Child::virtualMethod()(动态绑定)

    // 2. 访问父类的公有属性
    cout << "Parent's publicVar: " << childPtr->publicVar << endl;  // 输出: 10

    // 3. 显式调用父类的方法(即使子类重写了它)
    childPtr->Parent::virtualMethod(); // 输出: Parent::virtualMethod()

    // 4. 访问父类的保护属性(在子类内部或通过子类方法)
    childPtr->childMethod();           // 输出: Accessing protectedVar from child: 20

    delete childPtr;
    return 0;
}

关键点说明:

  1. 直接调用父类方法

    childPtr->publicMethod();  // 调用父类的publicMethod()
    
  2. 访问父类属性

    cout << childPtr->publicVar;  // 访问父类的公有属性
    
  3. 显式调用父类版本的方法(即使子类重写了它):

    childPtr->Parent::virtualMethod();  // 强制调用父类的版本
    
  4. 动态绑定(多态)

    • 如果父类方法是virtual的,通过指针调用时会根据对象的实际类型决定调用哪个版本(即使是子类指针)。
  5. 保护属性的访问

    • 父类的protected属性可以在子类内部直接访问,但不能通过父类指针直接访问。

通过这种方式,子类指针可以灵活地调用父类的方法和属性,同时保持对子类特有成员的访问权限。

posted @ 2025-05-14 11:13  一只大学生  阅读(6)  评论(0)    收藏  举报