《Effective C++读书笔记》--条款34:区分接口继承和实现继承

当我们设计一个类的时候,我们会希望其子类只继承成员函数的接口,但有时候又希望其继承接口和实现,但又希望能重写他们所继承的接口和实现或者不允许重写任何东西。我们首先要明确public继承含义,即is-A的关系,对于基类成立的所有条件,对其public继承的子类一定成立,反之则不然。

当我们希望子类继承该函数的接口时,我们可将该函数在基类中定义为纯虚函数,此时基类是不可被实例化的,其中代表的含义是“你必须提供一个该函数的实现,但设计者不干涉你如何去实现他”,比如设计一个人类,吃东西的函数是必须的,但设计者不关心你是用筷子吃还是刀叉吃,只需要实现即可。

当我们希望子类继承该函数的接口和实现时,我们就可写一个虚函数(虚函数的继承要求是函数名,返回值,参数类型均相同,这与子类中和父类的同名函数导致隐藏的规则不同,其中的同名函数值得是函数名相同,而其他参数可以不同)。其代表的含义是“你需要写一个该函数,如果你自己不想写,可以使用基类的该函数”,比如一个人类,吃东西的函数是必须的,但同时为你提供了一个默认用筷子吃东西的函数,你可以自己实现用刀叉吃东西的函数,也可以使用默认的用筷子吃东西的函数。

对于以上两种情况的结合来说,如果我们需要继承接口和默认实现,但又不想使我们忘记重写该函数导致调用了默认版本,我们可以将接口与实现分离开,例如以下代码

public:
    virturl void eat() = 0;
protected:
    void defaulteat()
    {
         cout << "use chopstick";
    }

如果我们想使用默认版本,就继承该接口同时在函数体内调用defaulteat(),否则我们就自己加以实现。与该设计类似的实现方法还有一种,也是本人在Qt中遇到过的实现方法:

也就是在子类的实现中调用父类的版本。

最后,对于非虚函数来说,他表示对继承的子类的一份强制实现,并且任何子类都不应该尝试去修改。
对于以上关于继承的讨论我们需要知道虚函数,纯虚函数和不同成员函数在继承中的意义,我们在设计类的时候,一要考虑继承的成本,二要考虑多态的灵活性,

public:
    virtual void eat()
    {
         cout << "chopstick eat";
    }  
class Derive:public Base
{
     void eat()
    {
        Base::eat();
    }
}


内容概要:本文详细介绍了使用COMSOL进行三相电力变压器温度场与流体场耦合计算的具体步骤技术要点。首先讨论了变压器温升问题的重要性现有仿真与实测数据之间的偏差,接着阐述了电磁--流三场耦合建模的难点及其解决方法。文中提供了关键的材料属性设置代码,如变压器油的密度粘度随温度变化的关系表达式,并强调了网格划分、求解器配置以及后处理阶段需要注意的技术细节。此外,还分享了一些实用的经验技巧,例如采用分离式步进求解策略、优化网格划分方式等,确保模型能够顺利收敛并获得精确的结果。最后,作者推荐了几种常用的湍流模型,并给出了具体的参数设置建议。 适用人群:从事电力系统设计、变压器制造及相关领域的工程师技术人员,特别是那些希望深入了解COMSOL软件在复杂多物理场耦合计算方面应用的人群。 使用场景及目标:适用于需要对变压器内部温度分布油流情况进行精确模拟的研究或工程项目。主要目的是提高仿真精度,使仿真结果更加贴近实际情况,从而指导产品设计优化运行参数。 其他说明:文中不仅包含了详细的理论解释技术指导,还提供了一些实际案例供读者参考。对于初学者来说,可以从简单的单相变压器开始练习,逐步掌握复杂的三相变压器建模技能。同时,作者提醒读者要注意单位的一致性材料属性的准确性,这是避免许多常见错误的关键所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值