利于优化的网站要备案吗,文章列表插件wordpress,实时国际新闻app,权威发布意思体现的是代码复用的思想
1、子类继承父类#xff0c;子类就拥有了父类的特性#xff08;成员方法和成员属性#xff09;
2、已存在的类被称为“基类”或者“父类”或者“超类”#xff1b;新创建的类被称为“派生类”或者“子类”
注意#xff1a; #xff08;1#…体现的是代码复用的思想
1、子类继承父类子类就拥有了父类的特性成员方法和成员属性
2、已存在的类被称为“基类”或者“父类”或者“超类”新创建的类被称为“派生类”或者“子类”
注意 1子类继承了父类子类就拥有了父类的属性和方法 2如果子类重写了父类的同名方法子类对象默认调用的是子类自己的成员方法如果想调用父类的同名方法要添加父类作用域限定符 #include iostreamusing namespace std;class Father{ public: int num188; int num299; public: //成员方法 void show()const{ coutnum1num1,num2num2endl; } void cook(){ cout做水煮鱼endl; } }; class Son:public Father{ //public放在继承的地方表示继承方式是公有继承 public: void sing(){ cout唱歌endl; } void cook(){ cout做红烧肉endl; } };int main(){ Son s1; s1.cook(); //默认子类调用的是自己的成员方法 s1.show(); s1.sing(); s1.Father::cook(); //子类可以使用添加父类作用域限定符来调用父类的同名方法 return 0; }1、构造函数
1.1 派生类的构造函数
继承中的无参构造函数
1基类父类中的构造函数不能被继承
2派生类子类中必须要调用基类中的构造函数来完成属性的初始化
3默认情况下编译器会自动在派生类中调用父类的无参构造函数
4子类继承了父类子类独有的属性需要在自己的构造函数进行初始化而子类从父类继承过来的属性必须通过子类构造函数调用父类构造函数进行初始化 #include iostreamusing namespace std;class Father{ public: int num188; int num299; public: //编译器默认的无参构造函数 Father(){} //有参构造函数 Father(int num1,int num2) :num1(num1),num2(num2){} }; class Son:public Father{ //public放在继承的地方表示继承方式是公有继承 public: int a; public: //编译器默认的子类无参调用父类无参构造函数 Son():Father(){} //子类有参构造函数调用父类有参构造函数来完成继承下来的属性的初始化 Son(int num1,int num2,int a):Father(num1,num2),a(a){} };int main(){ Son s2(10,55,66); // s2.show(); couts2.aendl; //66 return 0; }1.2 派生类调用基类构造函数
1目的因为构造函数和析构函数不能继承所以派生类的构造函数通过调用基类的构造函数完成部分属性的初始化
2派生类的构造函数调用基类的构造函数的方式透传构造、委托构造、继承构造
1.2.1 透传构造
派生类的构造函数直接调用基类的构造函数 class Father{ public: int num; public: //无参构造函数----委托构造 Father():Father(90){} //有参构造函数 Father(int num) :num(num){} }; class Son:public Father{ //public放在继承的地方表示继承方式是公有继承 public: int num1; public: //委托构造 Son():Son(2,88){} //透传构造 Son(int num1,int num):Father(num),num1(num1){} }; 1.2.2 委托构造
可维护性好但效率相对较低
思想一个类中的构造函数是可以调用这个类中的其他构造函数
父类的无参构造函数调用父类的有参构造函数子类的无参构造函数调用子类的有参构造函数子类的有参构造函数透传父类的有参构造函数
注意委托构造离不开透传构造 class Father{ public: int num; public: //无参构造函数----委托构造 Father():Father(90){} //有参构造函数 Father(int num) :num(num){} }; class Son:public Father{ //public放在继承的地方表示继承方式是公有继承 public: int num1; public: //委托构造 Son():Son(2,88){} //透传构造 Son(int num1,int num):Father(num),num1(num1){} }; 1.2.3 继承构造
透传构造的简写方式一句话自动实现透传构造编译器会自动给派生类添加n个构造函数n取决于基类中构造函数的个数并实现自动透传其基类构造函数 class Father{ public: int num; int age; string addr; public: //无参构造函数----委托构造 Father():Father(90){} //有参构造函数 Father(int num) :num(num){} Father(int age,string addr) :age(age),addr(addr){} }; class Son:public Father{ //public放在继承的地方表示继承方式是公有继承 public: int num199; public://继承构造 using Father::Father; };2、对象的构建和销毁的过程
1成员对象类中有一个成员该成员是对象类型叫做对象成员 先调用成员对象的构造函数再调用自己的构造函数析构函数则相反
2父子类继承时 先调用父类的构造函数再调用子类的构造函数析构函数则相反
3静态成员对象类中有一个静态成员该成员是一个对象类型 静态成员对象的构造函数先执行再执行自己的构造函数析构函数则相反
顺序 构造函数静态成员对象----成员对象----父类----子类 析构函数子类----父类----成员对象----静态成员对象
2.1 成员对象 class Demon{ public: //构造函数 Demon(){ cout成员对象的构造函数endl; } ~Demon(){ cout成员对象的析构函数endl; } };class Test{public: Test(){ cout构造函数endl; } ~Test(){ cout析构函数endl; } }; 2.2 父子类继承时 class Father{ public: Father(){ cout父类构造endl; } ~Father(){ cout父类析构endl; } }; class Son:public Father{ public: Son():Father(){ cout子类构造endl; } ~Son(){ cout子类析构endl; } }; 2.3 静态成员对象 class P{ public: P(){ cout静态成员对象的构造endl; } ~P(){ cout静态成员对象的析构endl; } }; class Phone{ public: //类内声明 static P p1; //静态成员变量的声明 Phone(){ cout构造函数endl; } ~Phone(){ cout析构函数endl; } }; P Phone::p1P(); //类外初始化 3、权限
3.1 权限修饰符
C中成员的权限修饰符有3种 1public共有的 类内、子类内、类外可以访问 2private私有的 只能类内访问 3protected受保护的 类内、子类内可以访问
注意如果权限修饰符可以省略默认是private #include iostreamusing namespace std;class Father{ public: int num1; private: int num2; protected: int num3; public: //构造函数 Father(int num1,int num2,int num3) :num1(num1),num2(num2),num3(num3){} void show()const{ coutthis-num1 ; //public 类内可以访问 coutthis-num2 ; //private 类内可以访问 coutthis-num3 ; //protected 类内可以访问 cout*******endl; } }; class Son:public Father{ public: using Father::Father; void fun()const{ coutthis-num1 this-Father::num1 ; //public 子类内可以访问 coutthis-num3 this-Father::num3 ; //protected 子类内可以访问 cout*******endl; } };int main(){ Father f1(1,2,3); f1.show(); Son s1(4,5,6); s1.fun(); couts1.num1endl; //public 类外可以访问 return 0; } 3.2 继承方式
3.2.1 public共有继承
1父类是public----子类也是public
2父类是protected----子类也是protected
3父类是private----子类也是private但是类内不可以直接访问可以间接访问 #include iostreamusing namespace std;class Father{ public: int num1; protected: int num2; private: int num3; public: Father(int num1,int num2,int num3) :num1(num1),num2(num2),num3(num3){} void fun()const{} int get_num3()const{ return num3; } }; class Son:public Father{ public: Son(int num1,int num2,int num3) :Father(num1,num2,num3){} void show(){ coutthis-num1endl; //父类public----子类也是public类内可以访问 coutthis-num2endl; //父类protected----子类也是protected // coutthis-num3endl; //报错父类private----子类也是private但是类内不可以直接访问 coutthis-Father::get_num3()endl; //父类private----子类也是private可以间接访问 cout******endl; } }; class Sunzi:public Son{ public: Sunzi(int num1,int num2,int num3) :Son(num1,num2,num3){} void fun()const{ coutthis-num1 this-Son::num1endl; //父类public----子类也是public派生类内可以访问 coutthis-num2 this-Son::num2endl; //父类protected----子类也是protected cout******endl; } };int main(){ Son s1(1,2,3); s1.show(); couts1.num1endl; //父类public----子类也是public类外可以访问 Sunzi sz(4,5,6); sz.fun(); return 0; }3.2.2 protected受保护的继承
1父类是public----子类是protected
2父类是protected----子类也是protected
3父类是private----子类也是private但是类内不可以直接访问可以间接访问 #include iostreamusing namespace std;class Father{ public: int num1; protected: int num2; private: int num3; public: Father(int num1,int num2,int num3) :num1(num1),num2(num2),num3(num3){} void fun()const{} int get_num3()const{ return num3; } }; class Son:protected Father{ public: Son(int num1,int num2,int num3) :Father(num1,num2,num3){} void show(){ coutthis-num1endl; //父类public----子类是protected coutthis-num2endl; //父类protected----子类也是protected // coutthis-num3endl; //报错父类private----子类也是private但是类内不可以直接访问 coutthis-Father::get_num3()endl; //父类private----子类也是private可以间接访问 cout******endl; } }; class Sunzi:protected Son{ public: Sunzi(int num1,int num2,int num3) :Son(num1,num2,num3){} void fun()const{ coutthis-num1 this-Son::num1endl; //父类public----子类是protected coutthis-num2 this-Son::num2endl; //父类protected----子类也是protected cout******endl; } };int main(){ Son s1(1,2,3); s1.show(); Sunzi sz(4,5,6); sz.fun(); return 0; }3.2.3 private私有继承
1父类是public----子类是private类内可以直接访问
2父类是protected----子类是private类内可以直接访问
3父类是private----子类也是private但是类内不可以直接访问可以间接访问
4、多重继承
4.1 概念
继承中允许有多个基类每一个基类的继承都可以看作是唯一的独一继承此时派生类就拥有了所有基类的特性 #include iostream using namespace std;class Sofa{ public: int num1; public: void job(){ cout沙发可以坐endl; } }; class Bed{ public: void work(){ cout床可以躺endl; } }; class SofsBed:public Sofa,public Bed{ public: void work(){ cout即可以躺又可以坐endl; } };int main(){ SofsBed sfb; sfb.job(); sfb.work(); coutsfb.numendl; sfb.Bed::work(); return 0; }问题多个基类同时拥有同名成员函数此时派生类对象直接调用该函数会产生歧义
解决方法添加基类作用域限定符
4.2 菱形继承
多继承中的若干个基类又同时拥有同一个基类此时叫菱形继承钻石继承 #include iostream using namespace std;//爷爷类 class Furniture{ public: void show(){ cout我们是家具endl; } }; //基类 class Sofa:virtual public Furniture{}; class Bed:virtual public Furniture{}; //派生类 class SofsBed:public Sofa,public Bed{};int main(){ SofsBed sfb; // sfb.show(); //报错问题两个基类拥有了同名函数产生了歧义 //解决方法1使用基类作用域限定符 sfb.Bed::show(); sfb.Sofa::show(); //解决方法2使用虚继承 /*继承方式有两种普通继承默认的和虚继承继承方式前添加virtual关键字*/ sfb.show(); return 0; }