zoukankan      html  css  js  c++  java
  • 第47课.父子间的冲突(同名)

    1.子类和父类中的同名成员变量

    a.子类可以定义父类中的同名成员
    b.子类中的成员将隐藏父类中的同名成员(同名覆盖)
    c.父类中的同名成员依然存在于子类中
    d.可以通过作用域分辨符(::)访问父类中的同名成员

    eg:

    Child c;
    c.mi = 100;            // 子类中的 mi
    c.Parent::mi = 1000    // 父类中的 mi
    

    2.子类和父类中的同名成员函数

    问题:子类中定义的函数是否能重载父类中的同名函数?

    答案:不能,子类和父类的作用域不同。函数重载必须发生在同一个作用域内。虽然子类是继承了父类,但这只是关系。在内存空间上来看,两个为两个独立的空间块,所运行的作用域不同。

    a.子类中的函数将隐藏父类中的同名函数
    b.子类无法重载父类中的同名函数
    c.使用作用域分辨符(::)访问父类中的同名函数
    d.子类可以定义父类中完全相同的成员函数(同名覆盖)

    eg:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class Parent 
    {
    public:
        int mi;
        
        void add (int v)
        {
            mi += v;
        }
        
        void add (int a, int b)
        {
            mi += (a + b);
        }
    };
    
    class Child : public Parent
    {
    public:
        int mi;         //同名覆盖
       
        void add (int x, int y, int z)         //父类中有add()函数,这里同名覆盖掉所有父类中的同名变量
        {
            mi += (x + y + z);
        }   
    };
    
    int main ()
    {
        Child c;
        
        c.mi = 100;
        c.Parent::mi = 1000;
        
        cout << "c.mi = " << c.mi << endl;                  // 100
        cout << "c.Parent::mi = " << c.Parent::mi << endl;  // 1000
        
        c.Parent::add(1);           // 这里调用的是父类中的add()  mi = 1001
        c.Parent::add(2, 3);        // 这里调用的是父类中的add()  mi = 1006
        c.add(4, 5, 6);             // 这里调用的是子类中的add()  mi = 115
        
        cout << "c.mi = " << c.mi << endl;
        cout << "c.Parent::mi = " << c.Parent::mi << endl;
        
        return 0;       
    }
    

    附:

  • 相关阅读:
    排序
    wine-qq 安装
    逆元模板
    最长上升子序列
    SGU[115] Calendar
    SGU[123] The sum
    SGU[105] Div 3
    SGU[102] Coprimes
    SGU[100] A+B
    poj-1325-Machine Schedule
  • 原文地址:https://www.cnblogs.com/huangdengtao/p/11950914.html
Copyright © 2011-2022 走看看