引入
有些类与类存在特殊关系:
我们发现:定义这些类时,下级别的成员除了拥有上一级的共性,还有自己的特性。这时候我们可以考虑使用继承的技术,减少重复代码。
1继承的基本语法
例如:
我们看到的很多网站,都有公共的头部、底部,只有中间的核心内容不同。
普通实现:
#include <iostream>
using namespace std;
//普通实现页面
class Java
{
public:
void head()
{
cout<<"head"<<endl;
}
void foot()
{
cout<<"foot"<<endl;
}
void content()
{
cout<<"java"<<endl;
}
};
class Python
{
public:
void head()
{
cout<<"head"<<endl;
}
void foot()
{
cout<<"foot"<<endl;
}
void content()
{
cout<<"Python"<<endl;
}
};
void test01()
{
Java ja;
ja.head();
ja.content();
ja.foot();
Python py;
py.head();
py.content();
py.foot();
}
int main() {
test01();
return 0;
}
继承实现:
#include <iostream>
using namespace std;
//继承实现页面
class Basic
{
public:
void head()
{
cout<<"head"<<endl;
}
void foot()
{
cout<<"foot"<<endl;
}
};
class Java:public Basic
{
public:
void content()
{
cout<<"Java"<<endl;
}
};
class Python:public Basic
{
public:
void content()
{
cout<<"Python"<<endl;
}
};
void test01()
{
Java ja;
ja.head();
ja.content();
ja.foot();
Python py;
py.head();
py.content();
py.foot();
}
int main() {
test01();
return 0;
}
继承的好处:减少重复代码
语法:class 子类:继承方式 父类
子类也称为派生类,父类也称基类
派生类中成员,包含两部分:
一部分是从基类继承过来的(共性),一类是自己增加的成员(个性)。
2继承方式
- 公共继承
- 保护继承
- 私有继承
3继承中的对象模型
父类中私有属性被编译器隐藏了,访问不到,但确实被继承了
#include <iostream>
using namespace std;
class Base
{
public:
int m_A;
protected:
int m_B;
private:
int m_C;
};
class Son :public Base
{
public:
int m_D;
};
void test01()
{
//16
//父类中所有成员属性都会被继承下来 父类中私有属性被编译器隐藏了,访问不到,但确实被继承了。
cout<<sizeof(Son)<<endl;
}
int main ()
{
test01();
}
4继承中构造和析构顺序
子类继承父类后,当创建子类对象,也会调用父类的构造函数。
问题:父类和子类的构造和析构顺序谁先谁后?
Base构造函数
Son构造函数
Son析构函数
Base析构函数
#include <iostream>
using namespace std;
class Base
{
public:
Base()
{
cout<<"Base构造函数"<<endl;
}
~Base()
{
cout<<"Base析构函数"<<endl;
}
};
class Son :public Base
{
public:
Son()
{
cout<<"Son构造函数"<<endl;
}
~Son()
{
cout<<"Son析构函数"<<endl;
}
};
void test()
{
Son a;
}
int main (){
test();
}
5继承同名成员的处理方式
问题:当子类和父类中出现同名的成员,如何通过子类对象,访问到子类或父类中同名的数据?
- 访问子类同名成员 直接访问即可
- 访问父类同名成员 需要加作用域
- 如果子类中出现和父类同名的成员函数,子类的同名成员会隐藏掉父类中所有同名成员。得加作用域