#include <iostream> using namespace std; class Parent { public: /* 此类父类写出了一个有参的构造函数 这子类必须写出构造函数*/ Parent(int a,int b){ x=a; y=b; cout<<"执行基类的构造函数parent"<<endl; } void Print(){ cout<<"x="<<x<<endl<<"y="<<y<<endl; } private: int x,y; }; class Child :public Parent{ public: Child(int a,int b,int c):Parent(a,b){ x=a; y=b; z=c; cout<<"执行派生类的构造函数child"<<endl; } void Print_1() { Print(); cout<<"z="<<z<<endl; cout<<x<<endl; cout<<y<<endl; } private: int z,a; int x,y; }; int main(){ Child ob(1,2,3); ob.Print_1(); return 0; }
一,父类没有写出构造函数,
子类的构造函数可以写成“任何”形式而不用顾及父类的构造函数。
例如:父类为CA,子类为CB,父类中没有写出任何构造函数,则子类中可以不写构造函数,或者构造函数可以写成以下几种:
CB(){};
CB():CA(){};
CB(int a, int b){};
CB(int a, int b):CA(){};
这几种形式都可以。即完全忽略父类的构造函数。
二,父类只写出了一个无参构造函数。
则子类可以不写构造函数,或者写成以下几种。
CB(){};
CB():CA(){};
CB(int a, int b){};
CB(int a, int b):CA(){};
即当父类只写出一个无参构造函数或者没有写构造函数效果是一样的。
三,父类只写出了一个有参构造函数
此时,子类应该“标准”地写出构造函数,例如
CA(int a, int b){};
CB(int a, int b):CA(a,b){};
或者:
CA(int a, int b){};
CB(int a, int b ,int c):CA(a,b){};
四,父类有多个有参构造函数,
此时,子类最少实现一个父类的构造函数即可。
五,父类有多个有参函数和一个无参构造函数。
此时,子类只需实现一个父类的构造函数即可,不管子类实现的是有参构造函数还是无参构造函数。
这时候应该注意,即使子类写成CB(){};也是正确的,说明父类的无参构造函数可以忽略。甚至写成CB(int a, int b){};也是正确的。
总结以上几条可以归纳出C++子类继承父类时构造函数的写法的规律为:
1,当父类有显式写出的构造函数时,子类最低限度的实现父类中的一个。
2,当父类没有显式写出构造函数时,子类可以不写构造函数或者“自由”书写构造函数。
更为普遍的规律总结如下:子类的构造函数以最少满足父类的一个构造函数为准。
- 顶
- 0
- 踩