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训练自己的数据集