c++ 类的语法2
类继承相关语法,写个demo,示例1:
void testClass2() {// 测试类继承中的访问权限class Base {public:int x;protected:int y;private:int z;public:Base() : x(0), y(0), z(0) {print();}virtual void print() { // 虚函数,子类可以覆盖cout << "Base print ..." << "x: " << x << " ,y: " << y << " ,z: " << z << endl;}int getZ() {return z;}};// 继承方式为public, 则子类中x访问权限为public,y为protected, z为private; // 成员变量访问权限会取最小,比如private继承,父类任何变量都不可访问class PublicExtend : public Base {// x 是 public,y 是 protected,z 不可访问public:void print() override { // 重写基类虚函数 , override:显式标记重写的虚函数,编译器会检查签名一致性cout << "subClass print" << "x: " << x << " ,y: " << y << " ,z: " << getZ() << endl; // 父类的z是私有变量不可见,用getZ函数获取}};PublicExtend obj;
}
打印:
这个示例中, 父类有无参构造函数,子类没有构造函数。 测试结论是,子类实例化时自动调用了父类的构造函数。
示例2,子类和父类都有无参构造函数:
void testClass2() {// 测试类继承中的访问权限class Base {public:int x;protected:int y;private:int z;public:Base() : x(0), y(0), z(0) {print();}virtual void print() {cout << "Base print ..." << "x: " << x << " ,y: " << y << " ,z: " << z << endl;}int getZ() {return z;}};// 继承方式为public, 则子类中x访问权限为public,y为protected, z为private; // 成员变量访问权限会取最小,比如private继承,父类任何变量都不可访问class PublicExtend : public Base {// x 是 public,y 是 protected,z 不可访问public:void print() override { // 重写基类虚函数 , override:显式标记重写的虚函数,编译器会检查签名一致性cout << "subClass print" << "x: " << x << " ,y: " << y << " ,z: " << getZ() << endl; // 父类的z是私有变量不可见,用getZ函数获取}// 构造函数PublicExtend() { // 没有显式调用父类构造函数print();}};PublicExtend obj;
}
打印:
打印日志说明调用了父类构造函数,然后调用子类构造函数。所以结论:当子类构造函数未显式调用父类构造函数时,编译器会自动调用父类的默认无参构造函数(前提是父类存在该构造函数)