一、继承定义
1.定义格式
下面我们看见Student是子类即派生类,Person是父类也是基类。
class Student :public Person
{
public:
void display()
{
cout << "b1:display0" << endl;
}
};
2.继承关系和访问限定符
从上面的定义可以看出,Person的前面是== public==,也就是说,子类继承父类的方式是公有的(public)。(
class的默认访问方式是private,struct的默认访问方式是public.
)
继承一共有三种方式,public,private,protected
。不同的继承关系,对应的访问限制也不同。
- 基类private成员在派生类中无论以什么方式继承都是不可见的。不可见是指
基类的私有成员仍然会被继承到派生类对象中
,但是语法限制上限制派生类不管在类外面还是列里面都不能去访问它。 - protected成员可以帮助基类成员在类外不被访问,但是可以在派生类中访问。
- 基类的私有成员在子类中年都是不可见的。结论的其他成员在子类的访问方式==Min(成员在基类的访问限定符,继承方式),public>protected>private。
二、基类和派生类对象赋值转换
- 派生类对象可以赋值给基类的对象、基类的指针、基类的引用。(即切片或者切割。就是把派生类中父类的那部分且过来赋值过去。)
- 基类对象不能赋值给派生类对象。
- 基类的指针货值引用可以通过强制类型转换赋值给朴胜磊的往后自主或者引用。但是必须是基类的指针是指向派生类对象时才是安全的。
当子类对象赋值给父类时。有三种情况即
(Person p=Student s, Person&p=Student s,Person*p=Student s)
三、继承中的作用域
- 在继承体系中基类和派生类都有独立的作用域。
- 在子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,周围种情况叫隐藏也叫重定义。 (在子类成员函数中,可以使用基类::基类成员 显示访问)
class Person
{
public:
void display()
{
cout << "Person:display" << endl;
}
};
class Student :public Person
{
public:
void display()
{
cout << "Student:display" << endl;
}
};
int main()
{
Student s;
s.display();
Person p;
p.display();
return 0;
}
== student继承了Person的display,但是因为构成隐藏==,所以s.display调用的是自己的display函数。
- 如果是成员函数的隐藏只需要函数名相同就构成隐藏。
- 注意在实际中继承体系里面最好不要定义同名的成员。
四、派生类的默认成员函数
五、继承与友元函数和静态成员
1.友元函数
友元函数不能继承
,所以基类友元不能访问子类的私有和保护成员。
如果子类也想用这个函数,可以在类内部也写声明一个同样的友元函数。
2.静态成员
基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。无论派生出多少个子类,都只有一个static成员实例。