子类指针指向子类对象,如何调用父类属性方法
在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;
}
关键点说明:
-
直接调用父类方法:
childPtr->publicMethod(); // 调用父类的publicMethod()
-
访问父类属性:
cout << childPtr->publicVar; // 访问父类的公有属性
-
显式调用父类版本的方法(即使子类重写了它):
childPtr->Parent::virtualMethod(); // 强制调用父类的版本
-
动态绑定(多态):
- 如果父类方法是
virtual
的,通过指针调用时会根据对象的实际类型决定调用哪个版本(即使是子类指针)。
- 如果父类方法是
-
保护属性的访问:
- 父类的
protected
属性可以在子类内部直接访问,但不能通过父类指针直接访问。
- 父类的
通过这种方式,子类指针可以灵活地调用父类的方法和属性,同时保持对子类特有成员的访问权限。