【C++庖丁解牛】继承的概念及定义 | 继承中的作用域 | 继承与友元继承与静态成员 | 复杂的菱形继承及菱形虚拟继承

慈云数据 2024-03-20 技术支持 84 0
🍁你好,我是 RO-BERRY 📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油

在这里插入图片描述


目录

  • 1.继承的概念及定义
    • 1.1继承的概念
    • 1.2 继承定义
      • 1.2.1定义格式
      • 1.2.2继承关系和
      • 1.2.3继承基类成员访问方式的变化
      • 2.基类和派生类对象赋值转换
      • 3.继承中的作用
      • 4.派生类的默认成员函数
      • 5.继承与友元
      • 6. 继承与静态成员
      • 7.复杂的菱形继承及菱形虚拟继承
        • 虚拟继承
        • 虚拟继承解决数据冗余和二义性的原理
        • 8.继承的总结和反思

          1.继承的概念及定义

          1.1继承的概念

          继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用

          继承后父类的Person的成员(成员函数+成员变量)都会变成子类的一部分。这里体现出了Student和Teacher复用了Person的成员。下面我们使用监视窗口查看Student和Teacher对象,可以看到变量的复用。调用Print可以看到成员函数的复用。.

          #include
          using namespace std;
          class Person
          {
          public:
          	void Print()
          	{
          		cout 
          protected:
          	int _stuid; // 学号
          };
          class Teacher : public Person
          {
          protected:
          	int _jobid; // 工号
          };
          int main()
          {
          	Student s;
          	Teacher t;
          	s.Print();
          	t.Print();
          	return 0;
          }
          
          protected:
          	string _name; // 姓名
          	string _sex; // 性别
          	int _age; // 年龄
          };
          class Student : public Person
          {
          public:
          	int _No; // 学号
          };
          void Test()
          {
          	Student sobj;
          	// 1.子类对象可以赋值给父类对象/指针/引用
          	Person pobj = sobj;
          	Person* pp = &sobj;
          	Person& rp = sobj;
          	//2.基类对象不能赋值给派生类对象
          	sobj = pobj;
          	// 3.基类的指针可以通过强制类型转换赋值给派生类的指针
          	pp = &sobj;
          	Student * ps1 = (Student*)pp; // 这种情况转换时可以的。
          	ps1-_No = 10;
          	pp = &pobj;
          	Student* ps2 = (Student*)pp; // 这种情况转换时虽然可以,但是会存在越界访问的问题
          	ps2-_No = 10;
          }
          
          protected:
          	string _name = "小李子"; // 姓名
          	int _num = 111;   // 身份证号
          };
          class Student : public Person
          {
          public:
          	void Print()
          	{
          		cout 
          	Student s1;
          	s1.Print();
          };
          
          public:
          	void fun()
          	{
          		cout 
          public:
          	void fun(int i)
          	{
          		A::fun();
          		cout 
          	A a;
          	B b;
          	b.fun();
          	return 0;
          }
          
          public:
          	void fun()
          	{
          		cout 
          public:
          	void fun(int i)
          	{
          		A::fun();
          		cout 
          	A a;
          	B b;
          	b.fun(1);
          	b.A::fun();
          	return 0;
          }
          
          public:
          	Person(const char* name = "peter")   //构造函数
          		: _name(name)
          	{
          		cout 
          		cout 
          		cout 
          		cout 
          public:
          	Student(const char* name, int num)    //构造函数
          		: Person(name)           //这里就是调用父类的构造函数初始化
          		, _num(num)
          	{
          		cout 
          		cout 
          		cout 
          			Person::operator =(s);     //显示调用父类的赋值拷贝构造
          			_num = s._num;
          		}
          		return *this;
          	}
          	//子类的析构函数和父类的析构函数构成隐藏关系
          	//这是由于后面多态的原因,析构函数被特殊处理,函数名都会被处理
          	~Student()
          	{
          		cout 
          	Student s1("jack", 18);
          	cout 
          	Test();
          	return 0;
          }
          
          public:
          	friend void Display(const Person& p, const Student& s);
          protected:
          	string _name; // 姓名
          };
          class Student : public Person
          {
          protected:
          	int _stuNum; // 学号
          };
          void Display(const Person& p, const Student& s)
          {
          	cout 
          	Person p;
          	Student s;
          	Display(p, s);
          	return 0;
          }
          
          public:
          	friend void Display(const Person& p, const Student& s);
          protected:
          	string _name; // 姓名
          };
          class Student : public Person
          {
          public:
          	friend void Display(const Person& p, const Student& s);
          protected:
          	int _stuNum; // 学号
          };
          void Display(const Person& p, const Student& s)
          {
          	cout 
          	Person p;
          	Student s;
          	Display(p, s);
          	return 0;
          }
          
          public:
          	Person() { ++_count; }
          protected:
          	string _name; // 姓名
          public:
          	static int _count; // 统计人的个数。
          };
          int Person::_count = 0;
          class Student : public Person
          {
          protected:
          	int _stuNum; // 学号
          };
          class Graduate : public Student
          {
          protected:
          	string _seminarCourse; // 研究科目
          };
          void TestPerson()
          {
          	Student s1;
          	Student s2;
          	Student s3;
          	Graduate s4;
          	cout 
          	TestPerson();
          	return 0;
          }
          
          public:
          	string _name; // 姓名
          };
          class Student : public Person
          {
          protected:
          	int _num; //学号
          };
          class Teacher : public Person
          {
          protected:
          	int _id; // 职工编号
          };
          class Assistant : public Student, public Teacher
          {
          protected:
          	string _majorCourse; // 主修课程
          };
          void Test()
          {
          	Assistant a;
          	a._name = "peter";      //编译器检查报错
          	a.Student::_name = "xxx";
          	a.Teacher::_name = "yyy";
          }
          int main()
          {
          	Test();
          	return 0;
          }
          
          public:
          	string _name; // 姓名
          };
          class Student : virtual public Person
          {
          protected:
          	int _num; //学号
          };
          class Teacher : virtual public Person
          {
          protected:
          	int _id; // 职工编号
          };
          class Assistant : public Student, public Teacher
          {
          protected:
          	string _majorCourse; // 主修课程
          };
          void Test()
          {
          	Assistant a;
          	a._name = "peter";
          }
          int main()
          {
          	Test();
          	return 0;
          }
          
          public:
          	int _a;
          };
          // class B : public A
          class B : virtual public A
          {
          public:
          	int _b;
          };
          // class C : public A
          class C : virtual public A
          {
          public:
          	int _c;
          };
          class D : public B, public C
          {
          public:
          	int _d;
          };
          int main()
          {
          	D d;
          	d.B::_a = 1;
          	d.C::_a = 2;
          	d._b = 3;
          	d._c = 4;
          	d._d = 5;
          	return 0;
          }
          
          protected:
          	string _colour = "白色"; // 颜色
          	string _num = "陕ABIT00"; // 车牌号
          };
          class BMW : public Car {
          public:
          	void Drive() { cout 
          public:
          	void Drive() { cout 
          protected:
          	string _brand = "Michelin";  // 品牌
          	size_t _size = 17;         // 尺寸
          };
          class Car {
          protected:
          	string _colour = "白色"; // 颜色
          	string _num = "陕ABIT00"; // 车牌号
          	Tire _t; // 轮胎
          };
          
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon