没有合适的资源?快使用搜索试试~ 我知道了~
预习资料 (1)1
需积分: 0 0 下载量 29 浏览量
2022-08-03
22:01:39
上传
评论
收藏 748KB PDF 举报
温馨提示
试读
15页
1.继承的访问控制方式 2.三种继承方式对子类访问的影响 3.父类如何设置子类的访问 1.父类的构造和析构 2.父类中的构造和析构执行顺序 3.继承中的构造函数
资源详情
资源评论
资源推荐
1继承
一,继承的基本概念
1.1类与类之间的关系
has-A,包含关系,用以描述一个类由多个“部件类”构成,实现has-A关系用类的成员属性表示,即
一个类的成员属性是另一个已经定义好的类。
use-A,一个类使用另一个类,通过类之间的成员函数相互联系,定义友元或者通过传递参数的方
式来实现。
is-A,即继承关系,关系具有传递性。
1.2继承的相关概念
万事万物皆有继承这个现象,所谓的继承就是一个类继承了另一个类的属性和方法,这个新的类包
含了上一个类的属性和方法,被称为子类或者派生类,被继承的类称为父类或者基类。
1.3.继承的特点
子类拥有父类的所有属性和方法(除了构造函数和析构函数)。
子类可以拥有父类没有的属性和方法。
子类是一种特殊的父类,可以用子类来代替父类。
子类对象可以当做父类对象使用。
1.4.继承的语法
二,继承中的访问控制
1.继承的访问控制方式
我们在一个类中可以对成员变量和成员函数进行访问控制,通过C++提供的三种权限修饰符实现。
在子类继承父类时,C++提供的三种权限修饰符也可以在继承的时候使用,分别为公有继承,保护继承
和私有继承。这三种不同的继承方式会改变子类对父类属性和方法的访问。
2.三种继承方式对子类访问的影响
public继承:父类成员在子类中保持原有的访问级别(子类可以访问public和protected)。
private继承:父类成员在子类中变为private成员(虽然此时父类的成员在子类中体现为private修
饰,但是父类的public和protected是允许访问的,因为是继承后改为private)。
protected继承
父类中的public成员会变为protected级别。
父类中的protected成员依然为protected级别。
父类中的private成员依然为private级别。
注意:父类中的private成员依然存在于子类中,但是却无法访问到。不论何种方式继承父类,子类
都无法直接使用父类中的private成员。
3.父类如何设置子类的访问
需要被外界访问的成员设置为public。
只能在当前类中访问设置为private。
只能在当前类和子类中访问,设置为protected。
三,继承中的构造和析构函数
1.父类的构造和析构
当创建一个对象和销毁一个对象时,对象的构造函数和析构函数会相应的被C++编译器调用。当在
继承中,父类的构造和析构函数是如何在子类中进行调用的呢,C++规定我们在子类对象构造时,需要
调用父类的构造函数完成对对继承而来的成员进行初始化,同理,在析构子类对象时,需要调用父类的
析构函数对其继承而来的成员进行析构。
2.父类中的构造和析构执行顺序
子类对象在创建时,会先调用父类的构造函数,如果父类还存在父类,则先调用父类的父类的构造
函数,依次往上推理即可。
父类构造函数执行结束后,执行子类的构造函数。
当父类的构造函数不是C++默认提供的,则需要在子类的每一个构造函数上使用初始化列表的方式
调用父类的构造函数。
析构函数的调用顺序和构造函数的顺序相反。
3.继承中的构造函数示例
# include<iostream>
using namespace std;
class Parent
{
protected:
char * str;
public:
Parent(char * str)
{
if (str != NULL)
{
this->str = new char[strlen(str) + 1];
strcpy(this->str, str);
}
else {
this->str = NULL;
}
cout << "父类构造函数..." << endl;
输出结果:
}
~Parent()
{
if (this->str != NULL)
{
delete[] this->str;
this->str = NULL;
}
cout << "父类析构函数..." << endl;
}
};
class Child:public Parent
{
private:
char * name;
int age;
public:
/* 在构造子类对象时,调用父类的构造函数 */
Child():Parent(NULL)
{
this->name = NULL;
this->age = 0;
cout << "子类无参构造函数..." << endl;
}
/* 在构造子类对象时,调用父类的构造函数 */
Child(char * name,int age):Parent(name)
{
this->name = new char[strlen(name) + 1];
strcpy(this->name, name);
cout << "子类有参构造函数..." << endl;
}
~Child()
{
if (this->name != NULL)
{
delete[] this->name;
this->name = NULL;
}
cout << "子类析构函数..." << endl;
}
};
int main()
{
Child c1;
Child c2("王刚",22);
return 0;
}
剩余14页未读,继续阅读
创业青年骁哥
- 粉丝: 18
- 资源: 341
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0