1、继承方式
继承的语法:class 子类 : 继承方式 父类
三种继承方式:
- 公有继承
- 保护继承
- 私有继承
就算子类访问不了父类中的private,但是还是会继承并隐藏
2、继承的对象的结构查看方式
通过,vs2017开发人员命令提示符 通过 cd
、dir
到项目的目录,然后输入:cl /d1 reportSingleClassLayout
,输入类名,然后靠 tab 来自动补齐文件名字。以此来查看对象的结构。比如:
cl /d1 reportSingleClassLayoutAnimal "main.cpp"
3、继承中的同名成员处理
- 访问子类同名成员 直接访问即可
- 访问父类同名成员 需要加作用域
- 当子类与父类拥有同名的成员函数,子类会隐藏父类中的同名成员函数,要使用需加作用域
class Father{
public:
Father(){
A = 100;
}
int A;
}
class Son{
public:
Son(){
A = 200;
}
int A;
}
void Test01(){
Son son;
cout << son.A << endl; //输出:200,默认的输出是子类的同名成员变量
cout << son.Father::A << endl; //输出:100,加了作用域,输出父类的同名变量
}
4、继承静态变量成员处理
静态成员
class Father{
public:
static int A;
};
int Father::A = 100; //类内声明,类外初始化
class Son{
public:
static int A;
};
int Son::A = 200; //类内声明,类外初始化
void test01(){
//通过对象访问
Son s;
cout << s.A << endl;
cout << s.Father::A << endl;
//静态变量又可以不创建对象,直接通过类名访问
cout << Son::A << endl;
cout << Son::Father::A << endl;
//通过子类域到父类域,访问到Father中的 重名静态变量
}
(静态函数同理)
5、多继承
C++中允许一个类继承多个类,C++实际开发中不建议用多继承。
语法:class 子类 : 继承方式 父类1, 继承方式 父类2...
多继承可能出现多个重名,需要用作用域来区分。
6、菱形继承
利用 虚继承 来解决菱形继承的问题。
//间接基类A
class A{
protected:
int m_a;
};
//直接基类B
class B: virtual public A{ //虚继承
protected:
int m_b;
};
//直接基类C
class C: virtual public A{ //虚继承
protected:
int m_c;
};
//派生类D
class D: public B, public C{
public:
void seta(int a){ m_a = a; } //正确
void setb(int b){ m_b = b; } //正确
void setc(int c){ m_c = c; } //正确
void setd(int d){ m_d = d; } //正确
private:
int m_d;
};
int main(){
D d;
return 0;
}
7、子类构造函数
假如父类的构造需要参数,那么子类构造的时候就需要用初始化列表来传递参数。
class A{
public:
A(int a):val(a){};
int val;
};
class B: public A{
public:
B(int a,int b):A(a),val2(b){};
int val2;
}