You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让父类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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 07:27:41