zoukankan      html  css  js  c++  java
  • Effective C++ 条款33 避免遮掩继承而来的名称

    1. C++基类和派生类的作用域为嵌套关系,同时存在作用域屏蔽规则,例如:

    class Base{
    public:
        void f();
        ...
    private:
        int a;
        ...
    }
    class Derived:public Base{
        ...
    }
    View Code

    那么Derived和Base之间的作用域关系就像这样

    如果Derived中没有定义a和fun,那么对在Derived作用域内对a的fun的使用将会由内而外直至全局作用域逐层查找;

    如果Derived中定义了a和fun,那么会使用Derived中的a和fun,但是如果Derived中a和fun的定义如果像这样:

    class Derived:public Base{
    public:
        void fun(int);
        string a;
        ...
    private:
        ...
    }
    View Code

    此时如果在Derived内存在如下语句:

    a=1;
    fun();

    都会编译不通过,因为由于名字屏蔽,Base的a和fun在Derived中将不可见,这就是作用域屏蔽规则.因此派生类对基类函数的重写将不是overload,而是override(覆写)

    2. 在采用public继承时,如果派生类重写基类函数,名字屏蔽会使得基类中同名函数在派生类中不可见,这实际上违反了条款32"public继承中派生类要完全继承基类接口"的原则,如果使基类的同名函数在派生类中仍然可见,可以使用using声明式:

    class Derived:public Base{
    public:
        using Base::fun;
        void fun(int);
        ...
    private:
        string a;
        ...
    }
    View Code

    如果并不想继承Base类所有的fun函数(private继承中可能出现),则可以使用"转交函数"(forwarding function)的方法,如下:

    class Derived:private Base{
    public:
        void fun(){
            Base::fun();
        }
        void fun(int);
        ...
    private:
        string a;
        ...
    }
    View Code
  • 相关阅读:
    java基础循环、条件语句、switch case
    java基础抽象类、接口、枚举、包
    java基础基本数据类型、变量类型、修饰符、运算符
    Mac权限问题,operation not permitted
    【比赛游记】NOIP2021 游记
    【比赛题解】NOIP2021 题解
    把LeetCode上的Sql题刷完了会有什么收获
    分析函数之Lead()、Lag()
    QT相关(c++)
    grpc
  • 原文地址:https://www.cnblogs.com/reasno/p/4794264.html
Copyright © 2011-2022 走看看