继承
继承的基本语法
class 子类(派生类):继承方式 父类(基类)
示例代码:
#include<iostream>
#include<string>
using namespace std;
//继承语法:class 子类:继承方式 父类
//公共页面
class BasePage
{
public:
void header()
{
cout << "首页、公开课、登录、注册" << endl;
}
void footer()
{
cout << "帮助中心、交流合作、站内地图" << endl;
}
void left()
{
cout << "JAVA、Python、C++" << endl;
}
};
//JAVA页面
class Java :public BasePage
{
public :
void content()
{
cout << "Java学科视频" << endl;
}
};
//C++页面
class CPP :public BasePage
{
public:
void content()
{
cout << "CPP学科视频" << endl;
}
};
void test01()
{
Java ja;
ja.header();
ja.footer();
ja.left();
ja.content();
CPP cpp;
cpp.header();
cpp.footer();
cpp.left();
cpp.content();
}
int main(){
test01();
system("pause");
return 0;
}
继承方式
继承方式和访问权限控制相同,分为三种:
1.公共继承(public)
2.保护继承(protected)
3.私有继承(private)
大致继承关系如下:
可以大致理解为继承方式为子类从父类手中拿过来的起步权限。
对于父类中的private变量,子类无法获取。
对于public和protected变量,如果以public方式继承,则维持原样,如果以protected方式继承,则在子类中都变为protected,如果以private方式继承,则都变为private。相当于继承方式是他们的上限,和他们自身在父类中的权限取min即可。
示例代码:
#include<iostream>
#include<string>
using namespace std;
class Base
{
public:
int m_A;
protected:
int m_B;
private:
int m_C;
};
class Son1 :public Base
{
public:
void func()
{
m_A = 10;// 父类中的公共和保护权限成员,依然可以访问。
m_B = 10;
//m_C = 10; //不可访问。
}
};
class Son2 :protected Base
{
public:
void func()
{
m_A = 100; //变为保护权限
m_B = 100;
//m_C = 100; 私有成员不可访问
}
};
class Son3 :private Base
{
public:
void func()
{
m_A = 100;
m_B = 100;
//m_C = 100; 私有成员不可访问
}
};
void test01()
{
Son1 s1;
s1.m_A = 10;
//s1.m_B = 10;//保护权限不可访问
Son2 s2;
//s2.m_A = 10; //保护权限不可访问
Son3 s3;
//s3.m_A = 100;//私有权限不可访问
}
int main(){
test01();
system("pause");
return 0;
}
继承中的对象模型
继承的子类继承父类的所有属性,包括私有的属性,私有属性只不过被编译器隐藏,即编译器不允许你访问,但人家确实继承下来了。
示例代码:
#include<iostream>
#include<string>
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()
{
//ans = 16
// 父类中所以非静态成员属性都会被子类继承下去
// 父类中私有成员属性 是被编译器给隐藏了,因此是访问不到,但是确实被继承下了。
cout << "size of Son = " << sizeof(Son) << endl;
}
int main(){
test01();
system("pause");
return 0;
}
之后采用开发人员命令提示符查看对象模型
在黑框中首先进入项目所在位置,之后输入以下代码:
c1 /d1 reportSingleClassLayouy类名 文件名
继承中的构造和析构顺序
当有继承时,顺序是先有父类构造,再子类构造,之后析构的话先有子类析构之后再有父类析构。
其实也挺好理解的,现有父亲再有儿子,然后按照栈式的方式取管理局部变量,所以先析构子类再析构父类。
#include<iostream>
#include<string>
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 test01()
{
Son son;
}
int main(){
test01();
system("pause");
return 0;
}