第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;       
}

附:

posted @ 2019-11-28 16:35  人民广场的二道贩子  阅读(147)  评论(0编辑  收藏  举报