c++的继承 子类继承父类元素 父类派生子类元素
在继承中 原有类称为基类或者父类 新类称为子类或者是派生类
子类继承所有父类的成员和函数并且在父类成员的基础上增加了新的成员
当子类成员或者函数和父类重名的时候父类得到隐藏优先使用子类新的成员
类的成员函数:默认构造 析构 拷贝构造 重载
父类构造和析构不能用于子类 子类需要用到构造和析构的时候需要自己重新区写
子类构造必须调用父类构造 如果没有显式调用 那就调用父类的无参构造
子类先调用父类的构造 然后调用子类的构造 再调用子类的析构再调用父类的构造
下图是继承时:类的访问权限 类内成员默认私有
头文件people.h
1 #pragma once 2 #include<iostream> 3 using namespace std; 4 class people 5 { 6 protected: 7 char name[20]; 8 char sex; 9 int age; 10 public: 11 people(); 12 ~people(); 13 people(int x); 14 void eat(); 15 void sleep(); 16 void getup(); 17 }; 18 19 class student :public people//学生类继承人类 人类派生学生类 20 { 21 float score;//在继承父类的成员变量的同时有自己的成员 22 char name[10];//默认私有 重写父类中的成员变量 23 public: 24 void fun()//新加的属性 25 { 26 sex = 'M';//调用父类中protect里的sex成员 27 eat();//默认输出子类的函数 28 cout << name << endl;//子类定义的成员 29 cout << people::name << endl;//父类隐藏的成员 30 } 31 void eat(){ 32 cout << "按时吃饭" << endl;//学生类类中eat函数的输出 33 } 34 student() :people(1)//子类的构造函数必须调用父类的构造函数 35 //子类继承父类的成员 初始化交给父类的构造函数 36 { 37 //people(1);错误的方式 创建了一个临时对象 38 } 39 ~student(){ 40 cout << "调用子类析构" << endl;//子类定义的成员 41 } 42 }; 43 44 class A 45 { 46 protected: 47 int x; 48 public: 49 A(int x = 0) :x(x){}//显式调用x 50 ~A(){} 51 A operator+(const A&a)//重载加法 52 { 53 return A(x + a.x); 54 } 55 }; 56 class B :public A//B类继承A类 57 { 58 protected: 59 int y; 60 public: 61 B(int x = 0, int y = 0) :A(x), y(y){}//给A类中x显示赋值x 给b中y利用初始化形参列表赋值 62 ~B(){} 63 B operator+(const B&b){ 64 B c; 65 c.x = x + b.x; 66 c.y = y + b.y; 67 return c; 68 } 69 }; 70 void fun2();//全局变量中定义 调用头文件中直接使用
头文件中定义类 在.cpp文件中声明类的方法
1 #include "people.h" 2 3 4 people::people() 5 { 6 } 7 people::people(int x){ 8 cout << "调用有参构造" << endl; 9 } 10 void eat(){ cout << "吃饭" << endl; } 11 void sleep(){ cout << "睡觉" << endl; } 12 void getup(){ cout << "8点起床" << endl; } 13 people::~people() 14 { 15 cout << "调用析构函数" << endl; 16 } 17 void fun2(){//在头文件people中调用fun2方法 18 A a(1); //给类a中的x显示赋1 19 B b(1, 2);//调用类b的构造方法 20 B c(3, 4);//与上一个式子功能相同 在类b中构造 21 a + c;//重载运算符在类B和类A中同时定义 保证类的加法可以进行 22 }
主函数
#include"people.h" int main() { A a;//类外定义对象的时候自动调用 A b = a;//同类对象初始化 调用拷贝构造 { student Mn;//先调用父类的有参构造 再调用子类有参构造 再调用子类析构 再调用父类析构 Mn.eat();//访问学生类中的eat函数 父类函数隐藏 cout << sizeof(Mn) << endl; }//利用作用域来显示调用析构函数的次数 people peo; //peo.sex;//私有成员可以访问但不可调用 cin.get(); return 0; }