1.什么是继承
简单点的说子承父业嘛,这就是继承。所以在C++中也是一样的,继承机制是面向对象程序设计使代码可以复用的重要手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,称为派生类。继承呈现了面向程序设计的层次结构,体现了由简单到复杂的认知过程。
2.继承的定义格式
3.派生类的大小
下面给出一段代码和他的运行结果
//.h
#include<iostream>
using namespace std;
class Base//基类
{
public:
Base()
{}
private:
int _b;
};
class Derived : public Base//派生类
{
public:
Derived()
{}
private:
int _d;
};
//.cpp
int main()
{
cout<<sizeof(Derived)<<endl;//运行结果为8
return 0;
}
上面的结果就说明派生类确实继承了基类里面的成员。但是呢,却不能访问基类中的私有成员。
4派生类的默认成员函数
派生类也是类,所以它也有六个默认成员函数:构造函数,析构函数,拷贝构造函数,赋值运算符的重载,取地址操作符重载,const修饰的取地址操作符重载。
5派生类的构造函数和析构函数的调用次序
6继承体系中的作用域
1:在继承体系中基类和派生类是两个不同的作用域。
2:子类和父类中有同名成员,子类成员将屏蔽父类对成员的直接访问。(在子类成员函数中,可以使用 基类::基类成员 这样的方式访问)
3:注意在实际中在继承体系里面最好不要不要定义同名的成员。
7单继承和多重继承和菱形继承
单继承:一个子类就只有一个父类
多继承:一个子类有多个父类
菱形继承:一个父类有两个子类,然后又有一个子类继承上面的两个子类,如图。
8多继承和菱形继承中的二义性问题和同名隐藏
下面给出多重继承的例子,菱形继承和这个是类似的。
class B1
{
public:
void Fun()
{}
int _b;
};
class B2
{
public:
void Fun()
{}
int _b;
};
class D : public B1,public B2
{
public:
void Funtest()
{
_b = 10;//如果你要访问B1中的就写为 B1::_b
Fun();//如果要访问B2中的就写为B2::Fun()
}
int _d;
}
这个代码就会出现同名隐藏的问题,如下图
要解决这个问题就需要在访问成员之前带上成员或者成员函数的作用域。
虚拟继承
虚拟继承就是为了解决菱形继承的二义性问题。
菱形继承的对象模型如下图。
![class Person
{
public:
string _name;
};
class Student : (vitural) public Person//加上virtual就可以解决
//二义性问题。
{
public:
int _num;
};
class Teacher : (vitural) public Person
{
public:
int _id;
};
class Assistant:public Student,public Teacher
{
public :
string _majorCourse;
void Test ()
{
Assistant d;
d.Student ::_name = 1;//访问Student类中的
d.Teacher::_name = 2;//访问Teacher类中的
}
} ;
为什么会多出四个字节,下面我们会说到一个偏移量表格。
还是上段代码,我们这次在.cpp文件里运行,代码如下
我们可以打开一个监视窗口看一下代码的具体运行
然后看一下它在内存中是怎么样的,打开一个内存窗口