xbcxp 2019-09-26 11:32 采纳率: 0%
浏览 302
已采纳

Effectrive C++ 44为什么用了using还要使用this指针

根据条款43,这两个方法是一个作用啊
图片说明

附上别人的条款43,44的链接

https://blog.csdn.net/gx864102252/article/details/76944704

  • 写回答

1条回答 默认 最新

  • 斗酒神僧 2019-09-29 15:31
    关注

    的确,既然子类using了基类的invert,那么在子类中调用基类的invert函数,"this->"不是必要的,去掉"this->"代码也能通过编译。但是,如果去掉"using SquareMatrixBase<T>::invert",那么"this->invert(n)"不能通过编译。因为子类的invert隐藏了基类的同名函数。以下两种情形,在子类中使用using将基类的函数引入:
    1)当子类的函数隐藏了基类的同名函数时,使用using引入基类的同名函数使其在子类中可见;
    2)当基类是类模板,在子类中调用基类的某个函数时,使用using引入基类的函数以指示编译器在基类中查找此函数的声明。
    参考下面的代码:

    // 情形1
    class Base
    {
    public:
        void f() { cout << "Base::f()" << endl; }
        void g() { cout << "Base::g()" << endl; }
    };
    
    class Sub : public Base
    {
    public:
        void f(int arg)          // 隐藏了基类的f
        {
            //    f();                // error : “Sub::f”: 函数不接受 0 个参数.
            cout << "Sub::f(int), arg : " << arg << endl;
        }
        using Base::g;         // 引入基类的函数g
        void g(int arg)        // 重载g
        {
            g();                     // ok, 调用Base::g()
            cout << "Sub::g(int), arg : " << arg << endl;
        }
    };
    
    void example1()
    {
        Sub sub;
        //sub.f();        // error : “Sub::f”: 函数不接受 0 个参数.
        sub.f(1);        // ok
        sub.g();         // ok
        sub.g(2);       // ok
    }
    
    // 情形2
    template  <typename T>
    class BaseT
    {
    public:
        void f1(T arg) { cout << "BaseT::f1(T), arg : " << arg << endl; }
        void g1(T arg) { cout << "BaseT::g1(T), arg : " << arg << endl; }
        void h1(T arg) { cout << "BaseT::h1(T), arg : " << arg << endl; }
    };
    
    template  <typename T>
    void h1(T arg) { cout << "::h1(T), arg : " << arg << endl; }
    
    template <typename T>
    class SubT : public BaseT<T>
    {
    public:
        void f2(T arg)
        {
            //    f1(arg);                  // error:  “f1”: 找不到标识符.
            printf("SubT::f2(T), arg : %d\r\n", arg);
        }
        using BaseT<T>::g1;      // 在基类中查找g1
        void g2(T arg)
        {
            g1(arg);                     // ok, 调用Base<T>::g1(T)
            printf("SubT::g2(T), arg : %d\r\n", arg);
        }
        void h2(T arg)
        {
            h1(arg);                   // ok, 调用::h1<T>(T).
            printf("SubT::g2(T), arg : %d\r\n", arg);
        }
    };
    
    void example2()
    {
        SubT<int> sub;
        sub.f2(1);
        sub.g2(2);
        sub.h2(3);
    }
    

    注意SubT的成员函数f2的定义,h1(arg)调用的是全局作用域的函数h1,而不是基类的成员函数h1。如果一个类的基类依赖于模板参数,那么对于无限定名字,编译器不会查找基类的作用域,在类的定义点和实例化点都不会。有关名字查找的详细内容,请参考:https://zh.cppreference.com/w/cpp/language/lookup

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥35 平滑拟合曲线该如何生成
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集