• using的应用


    using在c++中的应用

    1.作用域

    一般为了代码的冲突,都会用命名空间,例如c++里面的std

    using namespace std;
    
    • 1
    2.子类中引用基类成员

    仅引用基类中的protect和public成员,无论继承方式是private还是protect

    来看一个示例

    #include
    using namespace std;
    class Base{
    public:
        Base(){
            val = 0;
        }
        void fun()
        {
            cout << "val:" <<val<< ",base fun.." << endl;
        }
    protected:
        int val;
    };
    class subClass : private Base
    {
    public:
        using Base::fun;
        using Base::val;
    public:
        void fun2()
        {
            cout << "fun2.." << endl;
        }
    };
    
    int main(){
        subClass son;
        son.val = 10;
        son.fun();
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    一个派生类私有继承一个基类,是无法调用基类的public成员,但是使用using后能使用基类的protect和public成员,输出如下

    val:10,base fun..
    
    • 1
    3.取别名

    功能和c的typedef类似,不过更通俗易懂,例如

    typedef unsigned int uint;	//C
    using uint = unsigned int;	//C++
    
    • 1
    • 2

    using 跟typedef有什么区别呢?哪个更好用些呢?

    在取别名上没区别,说到好用,看一个示例

    typedef void(*fun) (void *);  //定义函数指针
    
    • 1

    若不是特别熟悉函数指针与typedef的童鞋,看不出fun是一个别名,那我们看一下c++

    c++:

    using fun = void(*) (void *); //c++定义函数指针
    
    • 1

    这种通俗易懂的语法让我们一眼就能看懂fun是一个别名

    最后应用一下,我们通过函数指针获取虚函数表,通过虚函数表调用虚函数

    #include
    using namespace std;
    class Base{
    public:
        Base(){
            val = 0;
        }
        virtual ~Base(){}
        void fun()
        {
            cout << "val:" <<val<< ",base fun.." << endl;
        }
    
    protected:
        int val;
    };
    class subClass : private Base
    {
    public:
        using Base::fun;
        using Base::val;
    public:
        virtual void fun2()
        {
            cout << "fun2.." << endl;
        }
    };
    
    using virtualFun = void(*) (void *);    //c++定义函数指针
    //由于虚函数表__vfptr是一个二级指针,所以
    using VPTR = virtualFun*;
    
    // typedef void(*VFUN) (void *);  // 将void* 重定义为函数指针
    // typedef VFUN* VPTR;            // 重定义指向虚函数表指针的类型
    
    int main(){
        subClass son;
        son.val = 10;
        son.fun();
        VPTR vPtr = *(VPTR*)&son;
        // virtualFun* vPtr = *(virtualFun**)&son
        vPtr[2](&son);  //vPtr[0]和vPtr[1]是基类和自身的虚析构,vPtr[2]为fun2地址
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
  • 相关阅读:
    信息检索 | 有出题价值的课后习题
    使用Java实现一个简单的贪吃蛇小游戏
    计算机视觉的优势和挑战
    线性动态规划
    java计算机毕业设计精品旅游项目管理系统源码+mysql数据库+系统+lw文档+部署
    AWK用法全解与sed去掉sql最后一个字段哪一行的逗号
    数字化外协生产综合管理系统,实现信息自动同步,数据自动统计分析!
    What is an HTTP Flood DDoS attack?
    HelpLook VS HelpDocs:知识库工具一对一比较
    浅谈 synchronized 锁机制原理 与 Lock 锁机制
  • 原文地址:https://blog.csdn.net/qq_44519484/article/details/126858142