C++使用指向子类的父类Person指针访问成员报错如何解决?
问题修复方案
错误原因
- C++编译阶段会对指针调用的成员方法做静态检查:你使用
Person类型指针调用getdata()、putdata()时,编译器会优先检查Person类的定义中是否存在对应方法,当前你的Person类没有声明这两个方法,因此直接抛出编译错误。 - 要实现「父类指针指向子类对象时,调用子类重写的对应方法」的多态效果,必须在父类中声明虚函数作为公共接口。
修复代码
只需要修改Person类的定义,添加纯虚函数接口即可,其余代码无需调整:
class Person{ public: string name; int age; // 声明纯虚函数,子类必须重写这两个方法 virtual void getdata() = 0; virtual void putdata() = 0; // 虚析构函数,避免释放子类对象时出现内存泄漏 virtual ~Person() = default; };
原理说明
- 包含纯虚函数的类属于抽象类,不能被实例化,刚好符合当前场景下
Person仅作为基类、不需要创建实例的需求。 - 声明为虚函数后,程序运行时会根据指针指向的实际对象类型(是
Professor还是Student),自动调用对应子类实现的getdata、putdata方法,实现你需要的多态效果。
内容的提问来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

