类的继承就是子类可以拥有父类的成员变量和成员函数
//public 修饰的成员变量 方法 在类的内部 类的外部都能使用
//protected: 修饰的成员变量方法,在类的内部使用 ,在继承的子类中可用 ;其他 类的外部不能被使用
//private: 修饰的成员变量方法 只能在类的内部使用 不能在类的外部。子类可以继承,但不能使用
类的调用语法
class Parent { public: int a; protected: int b; private: int c; }; class Child : protected Parent { public: protected: private: };
一、不同的继承方式会改变继承成员的访问属性
1)C++中的继承方式会影响子类的对外访问属性
public继承:父类成员在子类中保持原有访问级别
private继承:父类成员在子类中变为private成员
protected继承:父类中public成员会变成protected
父类中protected成员仍然为protected
父类中private成员仍然为private
2)private成员在子类中依然存在,但是却无法访问到。不论种方式继承基类,派生类都不能直接使用基类的私有成员 。
3)C++中子类对外访问属性表
父类成员访问级别 |
||||
继 承 方 式 |
public |
proteced |
private |
|
public |
public |
proteced |
private |
|
proteced |
proteced |
proteced |
private |
|
private |
private |
private |
Private |
二、兼容性原则
/*
兼容规则中所指的替代包括以下情况:
1)子类对象可以当作父类对象使用
2)子类对象可以直接赋值给父类对象
3)子类对象可以直接初始化父类对象
4)父类指针可以直接指向子类对象
5)父类引用可以直接引用子类对象
*/
#include <iostream> using namespace std; class Parent { public: void printP() { cout<<"我是爹..."<<endl; } Parent() { cout<<"parent构造函数"<<endl; } Parent(const Parent &obj) { cout<<"copy构造函数"<<endl; } private: int a; }; class child : public Parent { public: void printC() { cout<<"我是儿子"<<endl; } protected: private: int c; }; //C++编译器 是不会报错的 ..... void howToPrint(Parent *base) { base->printP(); //父类的 成员函数 } void howToPrint2(Parent &base) { base.printP(); //父类的 成员函数 } void main() { // Parent p1; p1.printP(); child c1; c1.printC(); c1.printP(); //赋值兼容性原则 //1-1 基类指针 (引用) 指向 子类对象 Parent *p = NULL; p = &c1; p->printP(); //1-2 指针做函数参数 howToPrint(&p1); howToPrint(&c1); //1-3引用做函数参数 howToPrint2(p1); howToPrint2(c1); //第二层含义 //可以让子类对象 初始化 父类对象 //子类就是一种特殊的父类 Parent p3 = c1; cout<<"hello..."<<endl; system("pause"); return ; }
三、继承中的构造析构调用原则
原则: 先构造父类,再构造成员变量、最后构造自己
先析构自己,在析构成员变量、最后析构父类
//先构造的对象,后释放
四、继承中的同名成员变量处理方法
1、当子类成员变量与父类成员变量同名时
2、子类依然从父类继承同名成员
3、在子类中通过作用域分辨符::进行同名成员区分(在派生类中使用基类的同名成员,显式地使用类名限定符)
4、同名成员存储在内存中的不同位置