C++ 类的继承与派生

简介: C++ 类的继承与派生

1、继承的概念

以李白为例

类1是类2的基类(父类),类2是类3的基类(父类)


2、继承(Inherit

为了实现代码复用

看例子

#include <iostream>
using namespace std;
class A {
public:
  int nA;
  A() {
    nA = 1;
  }
  void funcA() {
    cout << "funcA\n";  // \n和endl一样,都是换行
  }
};
class B : public A {    //B公有继承A
public:
  int nB;
  B() {
    nB = 2;
  }
  void funcB() {
    cout << "funcB\n";
  }
};
int main() {
  B b;
  b.funcA();  //调用继承得来的方法(父类中的函数)
  b.funcB();  //调用自己的方法
  cout << b.nA <<endl;  //调用继承得来的属性
  cout << b.nB;  //调用自己的属性
  return 0;
}

B公有继承A

对象B中既有继承得来的属性和方法,也有自己专属的属性和方法

输出结果:



3、继承方式

决定父类成员在子类中的访问控制属性


继承方式也分为:public(公有继承),protected(保护继承),private(私有继承)


父类的private成员不会被子类继承(也有一种说法是可以被子类继承,但不能直接访问)


(爸爸肯定想珍藏一些东西不想给儿子得到...或者说不能直接让儿子得到哈哈哈)

 

4、父子同名成员并存

class Father {
public:
  int n = 1;
  void func() {
    cout << "This is Father";
  }
};
class Son : public Father {
public:
  int n = 2;
  void func() {
    cout << "This is Son";
  }
  void set() {
  n = -2;
    Father::n = -1;
  }
};
int main() {
  Son son;
  son.func();  //直接用默认指子类的
  cout << endl;
  son.Father::func();  //用父类名字空间显示指明,则使用的是父类成员
  cout << endl;
  son.set();
  cout << son.n << endl;
  cout << son.Father::n;
  return 0;
}

子类中同时两个n和两个func(),一个继承父类的一个自己的

如果我们直接使用,默认是指子类成员

若需要使用父类成员,需用父类名字空间显示指明

运行结果:


5、虚函数(virtual)

关键字virtual加在函数名前

父类的虚函数可以在子类中被重写(override) ,即重新实现,但参数和返回值必须保持一致。

·含有虚函数的类叫做虚类

#include <iostream>
using namespace std;
class Human {
public:
  virtual void say() {
    cout << "I'm human";
  }
};
class Student : public Human {
public:
  void say() {
    cout << "I'm a student";  //重写父类的虚函数say()
  }
};
int main() {
  Student student;
  student.say();
}

从输出结果我们可以看出,父类的虚函数say()已经被子类重写

6、纯虚函数

不实现,仅声明为纯虚函数,留待子类里重写定义

含有纯虚函数的类叫抽象类,仅有纯虚函数的类叫接口

抽象类和接口不可实例化

#include <iostream>
using namespace std;
class Shape {  //只声明这是一个图形
public:
  virtual float getS() = 0;  //图形就可以求面积,但是不知道是什么图形,所以这里声明为纯虚函数,即让函数等于0
};
class Circle : public Shape {  //在子类里重写父类的纯虚函数,定义它是一个圆
private:
  float radius;
public:
  Circle(float radius) {
    this -> radius = radius;
  }
  float getS() { return 3.14 * radius * radius; }  //对圆求面积
};
int main() {
  Circle c(1.2);
  cout << c.getS() << endl;
  return 0;
}

 

OK,至此我们已经介绍完了类的三大特性:封装、继承、派生

后面我们会继续介绍类的最后一个特性----多态

创作不易,希望大家可以多多支持,各位的点赞收藏关注就是我持续创作的动力!

写博客不仅是我个人学习和成长的见证,也真心希望这些内容能对大家有所帮助。

目录
相关文章
|
5天前
|
Java C++
C++的学习之路:21、继承(2)
C++的学习之路:21、继承(2)
14 0
|
5天前
|
存储 编译器 C语言
c++的学习之路:5、类和对象(1)
c++的学习之路:5、类和对象(1)
19 0
|
5天前
|
C++
c++的学习之路:7、类和对象(3)
c++的学习之路:7、类和对象(3)
19 0
|
1天前
|
设计模式 编译器 数据安全/隐私保护
C++ 多级继承与多重继承:代码组织与灵活性的平衡
C++的多级和多重继承允许类从多个基类继承,促进代码重用和组织。优点包括代码效率和灵活性,但复杂性、菱形继承问题(导致命名冲突和歧义)以及对基类修改的脆弱性是潜在缺点。建议使用接口继承或组合来避免菱形继承。访问控制规则遵循公有、私有和受保护继承的原则。在使用这些继承形式时,需谨慎权衡优缺点。
12 1
|
3天前
|
设计模式 Java C++
【C++高阶(八)】单例模式&特殊类的设计
【C++高阶(八)】单例模式&特殊类的设计
|
4天前
|
编译器 C++
【C++基础(八)】类和对象(下)--初始化列表,友元,匿名对象
【C++基础(八)】类和对象(下)--初始化列表,友元,匿名对象
|
8天前
|
存储 安全 C语言
【C++】string类
【C++】string类
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
9天前
|
编译器 C++
标准库中的string类(上)——“C++”
标准库中的string类(上)——“C++”
|
10天前
|
编译器 C++
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(中)——“C++”
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(中)——“C++”