zoukankan      html  css  js  c++  java
  • using 关键字的作用

    我们都知道可以使用using关键字引入命名空间,例如:using namespace std;

    using还有个作用是在子类中引入父类成员函数。

    1) 当子类没有定义和父类同名的函数(virtual也一样)时,子类是可以直接调用父类的函数的:

     1 #include <iostream>
     2 #include <cstring>
     3 using namespace std;
     4 
     5 class CBase
     6 {
     7 public:
     8     void print() { cout << "Base::print()" << endl; }
     9 };
    10 
    11 class CChild : public CBase
    12 {
    13 public:
    14 };
    15 
    16 int main()
    17 {
    18     CChild child;
    19     child.print();
    20     return 0;
    21 }

    输出

    1 Base::print()

    2) 当子类定义了和父类同名的函数时,子类是调用自己的函数,子类的函数隐藏了父类的函数:

     1 #include <iostream>
     2 #include <cstring>
     3 using namespace std;
     4 
     5 class CBase
     6 {
     7 public:
     8     void print() { cout << "Base::print()" << endl; }
     9 };
    10 
    11 class CChild : public CBase
    12 {
    13 public:
    14     void print() { cout << "CChild::print()" << endl; }
    15 };
    16 
    17 int main()
    18 {
    19     CChild child;
    20     child.print();
    21     return 0;
    22 }

    输出

    1 CChild::print()

    3) 即使函数签名(函数的名称及其参数类型组合)不一样,也会隐藏父类的函数:

     1 #include <iostream>
     2 #include <cstring>
     3 using namespace std;
     4 
     5 class CBase
     6 {
     7 public:
     8     void print() { cout << "Base::print()" << endl; }
     9 };
    10 
    11 class CChild : public CBase
    12 {
    13 public:
    14     void print(int a) { cout << "CChild::print()" << endl; }
    15 };
    16 
    17 int main()
    18 {
    19     CChild child;
    20     child.print();
    21     return 0;
    22 }

    输出

    1 test.cpp: In function ?.nt main()?.
    2 test.cpp:20:14: error: no matching function for call to ?.Child::print()?
    3 test.cpp:20:14: note: candidate is:
    4 test.cpp:14:7: note: void CChild::print(int)
    5 test.cpp:14:7: note:   candidate expects 1 argument, 0 provided

    4)如果需要对子类对象使用父类的函数,就需要在子类中使用using引入父类成员函数:

     1 #include <iostream>
     2 #include <cstring>
     3 using namespace std;
     4 
     5 class CBase
     6 {
     7 public:
     8     void print() { cout << "Base::print()" << endl; }
     9 };
    10 
    11 class CChild : public CBase
    12 {
    13 public:
    14     using CBase::print;
    15     void print(int a) { cout << "CChild::print()" << endl; }
    16 };
    17 
    18 int main()
    19 {
    20     CChild child;
    21     child.print();
    22     return 0;
    23 }

    输出

    1 Base::print()
  • 相关阅读:
    错题记录——关于Java中private的用法(类与封装)
    深度学习-人脸识别-数据集和制作
    UE4使用经验记录
    pycharm 一直索引或索引过大占用系统盘问题
    深度学习portoch笔记_概念随笔
    mysql 找不到请求的 .Net Framework Data Provider。可能没有安装。
    halcon崩溃/异常信号11 后文件临时存储路径
    halcon 错误记录
    visual studio 2012 C#exe嵌入到子窗口,程序退出后子exe文件仍然被占用
    文件操作
  • 原文地址:https://www.cnblogs.com/jingyg/p/7443641.html
Copyright © 2011-2022 走看看