思考

子类中是否可以定义父类中的同名成员?

47-1例:

#include <iostream>
#include <string>

using namespace std;

class Parent
{
 public:
    int mi;
};

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

int main()
{
    Child c;   
    c.mi = 100;    // mi 究竟是子类自定义的,还是从父类继承得到的?
    return 0;
}

父子间的冲突

子类可以定义父类中的同名成员

子类中成员将隐藏父类中的同名成员

父类中的同名成员依然存在于子类中

通过作用域分辨符(::)访问父类中的同名成员

47-2例:

#include <iostream>

#include <string>
using namespace std;
namespace A
{
    int g_i = 0;
}
namespace B
{
    int g_i = 0;
}
class Parent
{
 public:
    int mi;
    Parent()
    {
       cout<<"Parent:"<<"&mi"<<&mi<<endl;
    }
};

class Child : public Parent
{
 public:
    int mi;
    Child()
    {
       cout<<"Child:"<<"&mi"<<&mi<<endl;

    }

};
int main()
{
   Child c;
    c.mi = 100;    // mi 究竟是子类自定义的,还是从父类继承得到的?
    c.Parent::mi = 1000;
    cout << "&c.mi = "<<&c.mi<<endl;
    cout << "c.mi = "<<c.mi<<endl;
     cout << "&c.Parent::mi = "<<&c.Parent::mi<<endl;
     cout << "c.Parent::mi = "<<c.Parent::mi<<endl;

    return 0;

}

输出:

Parent:&mi0xbfed2d68
Child:&mi0xbfed2d6c
&c.mi = 0xbfed2d6c
c.mi = 100
&c.Parent::mi = 0xbfed2d68
c.Parent::mi = 1000

重载

类中的成员函数可以进行重载

1.重载函数的本质为多个不同的函数

2.函数名和参数列表是唯一的标识

3.函数重载必须发生在同一个作用域中

父子间的函数重载
47-3.cpp

#include <iostream>

#include <string>



using namespace std;

namespace A

{

    int g_i = 0;

}

namespace B

{

    int g_i = 0;

}

class Parent

{

 public:

    int mi;
    int 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)
     {
        mi += (x+y+z);
     }
};
int main()
{
    Child c;
    c.mi = 100;    // mi 究竟是子类自定义的,还是从父类继承得到的?
    c.Parent::mi = 1000;
    cout << "c.mi = "<<c.mi<<endl;
    cout << "c.Parent::mi = "<<c.Parent::mi<<endl;
    c.Parent::add(1);
    c.Parent::add(2,3);
    c.add(4,5,6);
     cout << "c.mi = "<<c.mi<<endl;
    cout << "c.Parent::mi = "<<c.Parent::mi<<endl;
    return 0;
}

输出结果:

c.mi = 100
c.Parent::mi = 1000
c.mi = 115
c.Parent::mi = 1006

子类中定义的函数是不能重载父类中的同名函数的;

子类中的函数将隐藏父类的同名函数

子类无法重载父类中的成员函数

使用作用域分辨符访问父类中的同名函数

子类可以定义父类中完全相同的成员函数

Slide11.PNG


YingLi
6 声望4 粉丝

From zero to hero.