1. 继承
利用继承,减少重复代码
1.1 基本语法
class animal{
public:
void sleep(){
cout<<"睡觉"<<endl;
}
};
class dog:public animal{ //公共继承父类
public:
void hunt(){
cout<<"捕食"<<endl;
}
};
1.2 继承方式
继承语法:class 子类:继承方式 父类
继承方式:
公共继承
保护继承
私有继承
父类中所有非静态成员属性都会被子类继承下去
父类中私有成员属性是被编译器给隐藏了,因此是访问不道德,但是确实被继承下去了
1.3 继承中构造与析构的顺序
总结:
继承中先调用父类构造函数,再调用子类构造函数
析构函数调用顺序与构造函数相反
1.4 继承同名成员处理方式
访问子类同名成员,直接访问即可
访问父类同名成员,需要加作用域
class Base{
public:
int m_a;
Base(){
m_a=100;
}
void func(){
cout<<"Base"<<endl;
}
};
class Son:public Base{
public:
int m_a;
Son(){
m_a=200;
}
void func(){
cout<<"Son"<<endl;
}
};
int main(){
Son s;
cout<<s.m_a<<endl; //200
cout<<s.Base::m_a<<endl; //100
s.func(); //Son
s.Base::func(); //Base
return 0;
}
总结:
1.子类对象可以直接访问到子类中同名成员
2.子类对象加作用域可以访问到父类同名成员
3.当子类与父类拥有同名的成员函数,子类会隐藏父类中同名成员函数,加作用域可以访问到父类中同名函数
1.5 继承同名静态成员处理方式
访问子类同名成员,直接访问即可
访问父类同名成员,需要加作用域
class Base{
public:
static int m_a;
static void func(){
cout<<"Base"<<endl;
}
};
int Base::m_a=100;
class Son:public Base{
public:
static int m_a;
static void func(){
cout<<"Son"<<endl;
}
};
int Son::m_a=200;
int main(){
Son s;
//通过对象访问静态成员
cout<<s.m_a<<endl; //200
cout<<s.Base::m_a<<endl; //100
s.func(); //Son
s.Base::func(); //Base
//通过类名访问静态成员
cout<<Son::m_a<<endl; //200
cout<<Son::Base::m_a<<endl; //100
Son::func(); //Son
Son::Base::func(); //Base
return 0;
}
静态成员有两种访问方式:通过对象访问与通过类名访问
普通成员只有通过对象访问