如何让父类SetMyVar方法仅对父类实例生效(子类调用不执行)
解决方案:让父类方法仅对父类实例生效
方法一:用typeid判断实际对象类型
你之前的typeid用法有误——直接对this指针调用typeid只会得到指针本身的类型(永远是A*),必须对指针解引用,才能获取实际对象的真实类型。
修改后的SetMyVar方法如下(需包含<typeinfo>头文件):
#include <typeinfo> class A { public: A() {myVar = 20; } void SetMyVar(int val) { // 仅当对象是纯A类实例时,才执行修改操作 if (typeid(*this) == typeid(A)) { myVar = val; } } int myVar; };
注意:该方法依赖编译器的RTTI(运行时类型信息)支持,主流编译器默认开启该选项,若手动关闭过需重新开启。
方法二:基于多态的dynamic_cast判断
如果把父类A设为多态类(添加至少一个虚函数,比如虚析构函数),可以用dynamic_cast来判断对象是否为纯父类实例,这种方式更符合C++多态设计思想:
class A { public: A() {myVar = 20; } virtual ~A() = default; // 虚析构让A成为多态类 void SetMyVar(int val) { // 尝试将当前对象转为子类B的指针,转换失败则说明是纯A实例 if (!dynamic_cast<B*>(this)) { myVar = val; } } int myVar; };
但如果后续会新增多个子类继承A,这种逐个判断子类的方式会增加维护成本,此时typeid的方案更通用。
额外设计建议
虽然上述方法能解决当前问题,但这种“按对象类型分支处理”的写法违反了开闭原则——后续新增子类时可能需要修改父类代码。如果可以调整初始化流程,建议:
- 把父类初始化时需要的
SetMyVar逻辑拆成私有方法,仅在父类构造中调用; - 将对外的
SetMyVar设为虚函数,子类默认继承空实现,但如果必须强制子类无法修改,还是类型判断的方案更直接。
内容的提问来源于stack exchange,提问作者craker
相关产品推荐
相关产品推荐

