45 C++ - 继承中同名成员的处理方法

简介: 45 C++ - 继承中同名成员的处理方法

1.当子类成员和父类成员同名时,子类依然从父类继承同名成员

2.如果子类有成员和父类同名,子类访问其成员默认访问子类的成员(本作用域,就近原则)

3.在子类通过作用域::进行同名成员区分(在派生类中使用基类的同名成员,显示使用类名限定符)

class Base{
public:
  Base():mParam(0){}
  void Print(){ cout << mParam << endl; }
public:
  int mParam;
};
class Derived : public Base{
public:
  Derived():mParam(10){}
  void Print(){
    //在派生类中使用和基类的同名成员,显示使用类名限定符
    cout << Base::mParam << endl;
    cout << mParam << endl;
  }
  //返回基类重名成员
  int& getBaseParam(){ return  Base::mParam; }
public:
  int mParam;
};
int main(){
  Derived derived;
  //派生类和基类成员属性重名,子类访问成员默认是子类成员
  cout << derived.mParam << endl; //10
  derived.Print();
  //类外如何获得基类重名成员属性
  derived.getBaseParam() = 100;
  cout << "Base:mParam:" << derived.getBaseParam() << endl;
  return EXIT_SUCCESS;
}

注意: 如果重新定义了基类中的重载函数,将会发生什么?

class Base{
public:
  void func1(){
    cout << "Base::void func1()" << endl;
  };
  void func1(int param){
    cout << "Base::void func1(int param)" << endl;
  }
  void myfunc(){
    cout << "Base::void myfunc()" << endl;
  }
};
class Derived1 : public Base{
public:
  void myfunc(){
    cout << "Derived1::void myfunc()" << endl;
  }
};
class Derived2 : public Base{
public:
  //改变成员函数的参数列表
  void func1(int param1, int param2){
    cout << "Derived2::void func1(int param1,int param2)" << endl;
  };
};
class Derived3 : public Base{
public:
  //改变成员函数的返回值
  int func1(int param){
    cout << "Derived3::int func1(int param)" << endl;
    return 0;
  }
};
int main(){
  Derived1 derived1;
  derived1.func1();
  derived1.func1(20);
  derived1.myfunc();
  cout << "-------------" << endl;
  Derived2 derived2;
  //derived2.func1();  //func1被隐藏
  //derived2.func1(20); //func2被隐藏
  derived2.func1(10,20); //重载func1之后,基类的函数被隐藏
  derived2.myfunc();
  cout << "-------------" << endl;
  Derived3 derived3;
  //derived3.func1();  没有重新定义的重载版本被隐藏
  derived3.func1(20);
  derived3.myfunc();
  return EXIT_SUCCESS;
}

Derive1 重定义了Base类的myfunc函数,derive1可访问func1及其重载版本的函数。

Derive2通过改变函数参数列表的方式重新定义了基类的func1函数,则从基类中继承来的其他重载版本被隐藏,不可访问

Derive3通过改变函数返回类型的方式重新定义了基类的func1函数,则从基类继承来的没有重新定义的重载版本的函数将被隐藏。

任何时候重新定义基类中的一个重载函数,在新类中所有的其他版本将被自动隐藏。

目录
相关文章
|
1月前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
53 5
|
1月前
|
C++ 开发者
C++学习之继承
通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。
58 16
|
3月前
|
编译器 C++ 开发者
【C++】继承
C++中的继承是面向对象编程的核心特性之一,允许派生类继承基类的属性和方法,实现代码复用和类的层次结构。继承有三种类型:公有、私有和受保护继承,每种类型决定了派生类如何访问基类成员。此外,继承还涉及构造函数、析构函数、拷贝构造函数和赋值运算符的调用规则,以及解决多继承带来的二义性和数据冗余问题的虚拟继承。在设计类时,应谨慎选择继承和组合,以降低耦合度并提高代码的可维护性。
42 1
【C++】继承
|
3月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
156 5
|
4月前
|
安全 编译器 程序员
C++的忠实粉丝-继承的热情(1)
C++的忠实粉丝-继承的热情(1)
35 0
|
4月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
73 1
|
4月前
|
C++
C++番外篇——虚拟继承解决数据冗余和二义性的原理
C++番外篇——虚拟继承解决数据冗余和二义性的原理
64 1
|
4月前
|
编译器 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
58 0
|
4月前
|
程序员 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
61 0
|
4月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
46 3