Item 33:避免隐藏继承来的名称

本文探讨了C++中名称隐藏的问题,特别是当子类覆盖父类方法时如何避免隐藏父类其他重载方法。通过使用using声明或转发函数可以使父类方法重新变得可见。
Item 33: Avoid hiding inherited names.

其实本文的话题和继承完全没有关系,隐藏名称是作用域的问题。 在C++中每一对{ }都会开启一个新的作用域,并嵌套在当前作用域中。

一个示例

int x;
void func(){
    double x;
    cin>>x;     // read a new value for local x
}

可以看到double x隐藏了int x,因为C++的名称隐藏规则(name-hiding rules)隐藏的是名称,和类型无关!

继承作用域

子类可以访问父类中的名称,是因为子类的作用域是嵌套(nested in)在父类的作用域中的。 这一点也很符合直觉:

class Base{
public:
    void func_base();
};
class Derived{
public:
    void func_derived(){
        func_base();
    }
};

在func_derived()中调用func_base()时,编译器首先检查当前作用域内是否有名称func_base(当然C++是不允许在函数里定义函数的), 没有找到;然后去父作用域Derived中寻找名称func_base,仍然未找到;然后去再上一级作用域Base中寻找func_base,找到了!然后调用Base::func_base()。

如果还没找到,编译器还会去Derived所在命名空间下、全局作用域下寻找。

隐藏父类的名称

子类中重写(override)与父类方法同名的方法,将会隐藏父类中所有同名的重载方法。例如:

class Base{
public:
    virtual void func()=0;
    void func(int);
};
class Derived: public Base{
public:
    virtual void func();
};
...
Derived d;
d.func(1);      // Error!

Derived中声明的func方法,隐藏了父类中所有的func名称,包括所有的重载函数。

继承所有重载方法

当你从父类继承来了一系列的重载(overload)方法,而只想重写(override)其中的一个时,可以用using,否则其他重载方法会被隐藏。

class Derived: public Base{
public:
    using Base::func;
    virtual void func();
};
...
d.func(1);      // OK

继承一个重载方法

在public继承中,子类和父类是”is-a”的关系(见Item 32),所以通常我们希望从父类继承所有的方法。 但如果是private继承(见Item 39), 可能你只想要其中的一个,这时可以定义一个转发函数(forwarding function):

class Base{
public:
    virtual void mf1() = 0;
    virtual void mf1(int);
};
class Derived: private Base{
public:
    virtual void f1(){
        Base::mf1();        // 这是一个inline函数,见 Item30
    }
};

总结

  • 子类中的名称会隐藏父类中所有同名的属性。public继承表示这”is-a”的关系,应该避免这样做。
  • 使用using声明或者转发函数可以使父类名称再次可见。

转载地址:http://harttle.land/2015/09/06/effective-cpp-39.html
感谢作者 Harttle

内容概要:本文档详细介绍了基于直驱永磁同步发电机(PMSG)的1.5MW风力发电系统在Simulink环境下的建模与仿真全过程,涵盖了风力机空气动力学模型、PMSG电磁特性建模、不可控整流与逆变电路、直流环节、空间矢量脉宽调制(SVPWM)技术以及核心控制策略的设计。重点实现了最大功率点跟踪(MPPT)控制以提升风能捕获效率,并构建了电压外环与电流内环协同工作的双闭环控制系统,通过仿真验证了系统在不同风速条件下稳定运行的能力及动态响应性能。; 适合人群:适用于具备电力系统、电机控制理论基础及Simulink仿真操作经验的研究生、科研人员和从事新能源发电系统开发的工程技术人员;特别适合正在进行风电系统建模、控制算法研究或完成相关毕业设计的专业人士。; 使用场景及目标:①深入理解直驱式PMSG风力发电系统的整体架构与工作机理;②掌握从物理部件建模到控制策略实现的完整Simulink仿真流程;③学习并复现MPPT控制、双闭环控制等关键技术方案;④为后续开展低电压穿越、并网稳定性分析、故障诊断等高级课题提供可靠的仿真平台支撑。; 阅读建议:建议结合Matlab/Simulink软件动手实践,逐模块搭建模型,重点关注各控制环节的参数设计与调试方法,同时可参照文中提供的其他风电相关资源进行拓展学习与对比分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值