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函数,则从基类继承来的没有重新定义的重载版本的函数将被隐藏。

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

目录
相关文章
|
4天前
|
编译器 C++
【C++】详解C++的继承
【C++】详解C++的继承
|
2天前
|
存储 C++
【C++】string类的使用③(非成员函数重载Non-member function overloads)
这篇文章探讨了C++中`std::string`的`replace`和`swap`函数以及非成员函数重载。`replace`提供了多种方式替换字符串中的部分内容,包括使用字符串、子串、字符、字符数组和填充字符。`swap`函数用于交换两个`string`对象的内容,成员函数版本效率更高。非成员函数重载包括`operator+`实现字符串连接,关系运算符(如`==`, `&lt;`等)用于比较字符串,以及`swap`非成员函数。此外,还介绍了`getline`函数,用于按指定分隔符从输入流中读取字符串。文章强调了非成员函数在特定情况下的作用,并给出了多个示例代码。
|
2天前
|
存储 编译器 数据安全/隐私保护
|
9天前
|
C++
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
11 0
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
|
10天前
|
C++
【C++】学习笔记——继承_2
【C++】学习笔记——继承_2
15 1
|
2天前
|
C++
【C++】string类的使用④(常量成员Member constants)
C++ `std::string` 的 `find_first_of`, `find_last_of`, `find_first_not_of`, `find_last_not_of` 函数分别用于从不同方向查找目标字符或子串。它们都返回匹配位置,未找到则返回 `npos`。`substr` 用于提取子字符串,`compare` 则提供更灵活的字符串比较。`npos` 是一个表示最大值的常量,用于标记未找到匹配的情况。示例代码展示了这些函数的实际应用,如替换元音、分割路径、查找非字母字符等。
|
2天前
|
编译器 C++
【C++】类和对象⑤(static成员 | 友元 | 内部类 | 匿名对象)
📚 C++ 知识点概览:探索类的`static`成员、友元及应用🔍。
|
2天前
|
存储 编译器 C++
C++基础知识(六:继承)
多态是面向对象编程的四大基本原则之一,它让程序能够以统一的接口处理不同的对象类型,从而实现了接口与实现分离,提高了代码的灵活性和复用性。多态主要体现在两个层面:静态多态(编译时多态,如函数重载)和动态多态(运行时多态,主要通过虚函数实现)。
|
9天前
|
程序员 编译器 C++
【c++】继承
【c++】继承
7 0
|
10天前
|
安全 Java 程序员
【C++航海王:追寻罗杰的编程之路】继承你学会了么?
【C++航海王:追寻罗杰的编程之路】继承你学会了么?
10 0