父子的冲突

  • 思考问题:子类是否可以定义父类中的同名成员?如果可以,如何区分?如果不可以,为什么?
  • 实验
  • 新的知识点:
  1. 子类可以定义父类中的同名成员
  2. 子类中的成员将隐藏父类中的同名成员
  3. 父类中的同名成员依然存在于子类中
  4. 通过作用域分辨符(::)访问父类中的同名成员
  • 访问父类中的同名成员
Child c;
c.mi = 100;         //子类中的mi
c.Parent::mi = 1000;//父类中的mi
  • 实验
// 父子间的冲突.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <string>
using namespace std;
class Parent
{
public:
    int mvalue;
    Parent()
    {
        mvalue = 0;
    }
    ~Parent()
    {
    }
};
class Child :public Parent
{
public:
    int mvalue;
    Child()
    {
        mvalue = 0;
    }
    ~Child()
    {
    }
};
int main()
{
    Child c;
    c.mvalue = 5;
    c.Parent::mvalue = 10;
    cout << "c.mvalue=" << c.mvalue << endl;
    cout << "c.Parent::mvalue=" << c.Parent::mvalue << endl;
}
  • 运行结果
c.mvalue=5
c.Parent::mvalue=10
  • 再论重载
  1. 类中的成员函数可以进行重载
  2. 重载函数本质为多个不同的函数
  3. 函数名和参数列表是唯一的标识
  4. 函数重载必须发生在同一个作用域中
  • 思考:子类中定义的函数是否能重载父类中的同名函数
  • 知识点
  1. 子类中的函数将隐藏父类的同名函数
  2. 子类无法重载父类中的成员函数(因为它们不属于同一个作用域)
  3. 使用作用域分辨符访问父类中的同名函数
  4. 子类可以定义父类中完全相同的成员函数
  • 实验
// 父子间的冲突.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <string>
using namespace std;
class Parent
{
public:
    int mvalue;
    Parent()
    {
        mvalue = 0;
    }
    ~Parent()
    {
    }
    void set(int a)
    {
        mvalue = a;
    }
};
class Child :public Parent
{
public:
    int mvalue;
    Child()
    {
        mvalue = 0;
    }
    ~Child()
    {
    }
    void set(int b,int c )
    {
        mvalue = mvalue + b + c;
    }
    void set(int d,int e,int f)
    {
        mvalue = mvalue + d + e + f;
    }
};
int main()
{
    Child c;
    c.set(1,2);
    c.set(3, 4, 5);
    cout << "c.mvalue = " << c.mvalue << endl;
    cout << "c.Parent::mvalue = " << c.Parent::mvalue << endl;
    c.Parent::mvalue = 6;
    c.Parent::set(1);
    c.set(1, 2);
    c.set(3, 4, 5);
    cout << "c.mvalue = " << c.mvalue << endl;
    cout << "c.Parent::mvalue = " << c.Parent::mvalue << endl;
}
  • 运行结果
c.mvalue = 15
c.Parent::mvalue = 0
c.mvalue = 30
c.Parent::mvalue = 1
  • 小结
  1. 子类可以定义父类中的同名成员
  2. 子类中的成员将隐藏父类中的同名成员
  3. 子类和父类中的函数不能构成重载关系
  4. 子类可以定义和父类中完全相同的成员函数
  5. 使用作用域分辨符访问父类中的同名函数
 
 
posted @ 2020-01-31 12:20  认真做个普通人  阅读(222)  评论(0编辑  收藏  举报