c++ 学习 · 继承 · 的使用

简介: c++ 学习 · 继承 · 的使用

概念:

有时候当我们需要好几种类的时候,有些类里面的成员可能会存在重复的情况,那就在想有没有一种办法可以,让这些类既有大家都共同拥有的,也要有自己独有的呢? -- 继承

14d9d2c87fc94d2a824d18a1dbec12f8.jpg

继承后父类的数据A会变成 子类的一部分

class S
{
public:
    int a;
};
class W :public S //public为继承的方式
{
public:
    int b;
};

0502bc9b578b4810b1480c369cbd5690.jpg


访问方式:

6ef955f75081483385a5dbf3277b2ac5.jpg

 不可见意思就是子类的 类外 和 类里都不能访问;protected / private:子类的 类里可以访问,类外不可以。


如果基类成员需要在派生类中被访问,但是又不想被类外访问就定义为protect,这也看出保护成员限定符是因继承才出现的。

class 的默认继承方式是private ;struct 是 public


赋值转换

派生类对象可以赋值给 基类的对象 / 基类的指针 / 基类的引用。把派生类中父类的那部分数据切来赋值过去 (只有公有继承的父子类,才可以实现)

23337a94199642b7980276dc5d46d769.jpg

但是父类的对象不能赋值给子类


重定义:

如果子类和父类有同名的成员,那么访问子类里的这些数据,会优先访问子类的,屏蔽父类的,这个叫做隐藏,也叫做重定义。(但不建议定义的时候有重名的成员)

class S
{
public:
    void f()
    {
        cout << "Hello !" << endl;
    }
};
class M :public S
{
public:
    void f(int)
    {
        cout << "Hello !" << endl;
    }
};
int main()
{
    S a;
    M b;
    a.f();
    b.f();
    b.f(8);
    return 0;
}

可以看到这里的f函数也是 隐藏(重定义) 。

不是重载哦 重载需要两个这里的两个函数在同一作用域里面。

这个代码是无法正常允许的,会在编译的时候出错。


友元:

友元没有传递的这个说法,一个函数/类是父类的友元,但不是它不会是派生类的友元

友元关系不会被继承!!!


派生类的friend函数可以访问派生类本身的一切变量,包括从父类继承下来的protected域中的变量。但是对父类来说,他并不是friend的。

class B;
class A
{
  friend B;
private:
  int a;
};
class B : public A
{
public:
  void fun()
  {
    cout << a;
  }
  int b;
};

 这段代码中 数据a 是被private限定的,无论什么继承都是private,不能访问的,但是如果我让子类B成为了父类A的友元,就可以在B类里面访问了,当然类外依旧是不可以的!!!


静态成员:

在继承中,静态成员,父类和子类都可以访问,属于是共用的  

class A
{
public:
  static void dunc()
  {
    cout << "Hello" << endl;
  }
  int a;
};
class B : public A
{
public:
  int b;
};
int main()
{
  B::dunc();
  return 0;
}


默认函数:

子类会优先调用父类的构造函数初始化那些继承自父类的成员,然后再初始化自己的。

class S
{
public:
  S(int num )
  {
    x = num;
  }
  int x;
};
class M :public S
{
public:
  M(int m = 11, int n = 22)
    : y(n),
    x(m)
  { }
  int y;
};
int main()
{
  M b;
  return 0;
}

这个代码是会报错的哦。S类没有构造函数,而子类会优先调用父类的构造,就报错了,还有一个错误:

5455dac20cc8469c9490e0432bf249a5.jpg

这个可以这样解决(赋值 拷贝构造函数也是这样):

class S
{
public:
  S(int num)
  {
    x = num;
  }
  int x;
};
class M :public S
{
public:
  M(int m = 11, int n = 22)
    : y(n), 
    S(m)
  { }
  int y;
};
int main()
{
  M b;
  return 0;
}

当然这样 x 就变成11了,这里依然也是先调用S的构造函数,初始化列表初始化顺序是看变量的声明顺序的,默认继承自父类的成员是最前的

class S
{
public:
  S(int num)
  {
    x = num;
  }
  S(const S& data)
  {
    x = data.x;
  }
  S& operator=(const S& data)
  {
    if (this != &data)
    {
      x = data.x;
    }
  }
  int x;
};
class M :public S
{
public:
  M(int m = 11, int n = 22)
    : y(n), 
    S(m)
  { }
  M(const M& data)
    :S(data.x),
    y(data.y)
  { }
  M& operator=(const M& data)
  {
    if (this != &data)
    {
      S::operator=(data.x);
      y = data.y;
    }
  }
  int y;
};

拷贝构造函数需要声明是父类的,不然会和子类的拷贝构造函数构成 隐藏

子类的析构函数不需要显示的调用父类的析构函数:

    ① 显示调用如果不声明会构成 隐藏 :因为多态的需要,析构函数名会被统一为destructor()

       ② 即使你声明了是调用父类的析构,因为析构顺序就是先子后父,子类析构完会自动调用父类的

目录
相关文章
|
3月前
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
82 0
|
29天前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
|
1月前
|
安全 程序员 编译器
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
84 11
|
1月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
54 1
|
1月前
|
C++
C++番外篇——虚拟继承解决数据冗余和二义性的原理
C++番外篇——虚拟继承解决数据冗余和二义性的原理
39 1
|
1月前
|
Java 编译器 C++
c++学习,和友元函数
本文讨论了C++中的友元函数、继承规则、运算符重载以及内存管理的重要性,并提到了指针在C++中的强大功能和使用时需要注意的问题。
22 1
|
1月前
|
安全 编译器 程序员
C++的忠实粉丝-继承的热情(1)
C++的忠实粉丝-继承的热情(1)
20 0
|
1月前
|
编译器 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
31 0
|
1月前
|
程序员 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
33 0
|
2月前
|
C++
C++(二十)继承
本文介绍了C++中的继承特性,包括公有、保护和私有继承,并解释了虚继承的作用。通过示例展示了派生类如何从基类继承属性和方法,并保持自身的独特性。此外,还详细说明了派生类构造函数的语法格式及构造顺序,提供了具体的代码示例帮助理解。