Effective C++读书笔记一 条款36 绝对不要重新定义public继承来的non-virtual函数

来源:互联网 发布:ubuntu 安装lnmp php7 编辑:程序博客网 时间:2024/06/05 22:41

Effective C++36 never refine inherited non-virtual function

1.实验如果违反该条规则会如何

#include <iostream>using namespace std;class B{    public:        void mf(){            cout<<"base"<<endl;        }};class D: public B{    public:        void mf(){            cout<<"derived"<<endl;        }};int main(){    D x;    B* pb = &x;    pb->mf();    D* pd = &x;    pd->mf();}

这里写图片描述

分析由于调用的函数是非虚函数,使用指针调用时会发生静态绑定,因此调用指针的静态类型所指的对应函数

2 理论分析
public继承中,非虚函数的继承其实代表了不变性应该凌驾于特异性之上,所以去改变non-virtual函数在子类中的定义本来就与想要表达的语意矛盾.
因此 不要在子类中重新定义public 继承而来的 non-virtual function.

阅读全文
0 0
原创粉丝点击