成员变量覆盖

父子间的同名成员变量:

         子类成员将隐藏父类的成员,但是父类成员变量只是被隐藏,父类的同名函数依旧存在于子类中。

         可以通过作用域分辨符( :: )访问父类的同名同名变量。

         通过子类对象调用同名变量时,只会调用子类的成员变量。

#include <iostream>
#include <string>

using namespace std;

class Parent
{
public:
    int value;
};

class Child : public Parent
{
public:
    int value;
};

int main()
{
    Child c;   
    c.value = 100;          // 访问子类的value
    c.Parent::value = 100;  // 通过父类名和作用域分辨符访问父类的value   
    return 0;
}

父子间的同名成员函数:

        子类继承父类时同名函数不是函数重载,原因是作用域不同,只是函数同名覆盖。

        父类的同名函数只是被隐藏,但依旧存在于子类中。

        通过作用域分辨符( :: )访问父类同名函数。

        通过子类对象调用同名成员函数时,只会调用子类的成员函数。

        子类可以定义和父类中完全相同的同名函数。

#include <iostream>
#include <string>

using namespace std;

class Parent
{
public:
    void add(int x)
    {
        std << "parent : add(int x) " << endl;
    } 
    void add(int x, int y)
    {
        std << "parent : add(int x, int y) " << endl
    }
};

class Child : public Parent
{
public:
    void add(int x)  // 和父类中完全相同的函数,作用域不同,合法
    {
        std << "Child : add(int x)" << endl;
    }   
    void add(int x, int y) // 和父类中完全相同的函数,作用域不同,合法
    { 
        std << "Child : add(int x, int y)" << endl;
    }
    void add(int x, int y, int z) // 和父类中函数名相同的函数, 作用域不同,只是覆盖,不是重载
    {
        std << "Child : add(int x, int y, int z)" << endl;
    }
};

int main()
{
    Child c;
    c.add(1);            // Child : add(int x)
    c.add(1,1);          // Child : add(int x, int y)
    c.add(1,1,1);        // Child : add(int x, int y, int z)
    
    c.Parent::add(1);    // parent : add(int x)
    c.Parent::add(1,1);  // parent : add(int x, int y)
    return 0;
}
原文地址:https://www.cnblogs.com/zsy12138/p/10847899.html