本文主要是介绍C++从零开始的打怪升级之路(day41),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这是关于一个普通双非本科大一学生的C++的学习记录贴
在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料
那么开启正题
今天分享的是关于继承的知识点
1.派生类的默认成员函数
首先我们来回顾以下默认成员函数是哪几个
1.构造函数 完成初始化工作
2.析构函数 完成清理工作
3.拷贝构造函数 使用同类对象初始化创建新对象
4.赋值重载函数 把一个对象赋值给另一个对象
5.取地址重载函数 普通对象取地址
6.const取地址重载函数 const对象取地址
那么,对于派生类,我们的默认成员函数是怎样的呢
1.派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员,如果基类没有默认的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用
2.派生类的拷贝构造函数必须调用基类拷贝构造函数完成基类的拷贝初始化
3.派生类的operator=必须要调用基类的operator=完成基类的复制
4.派生类的析构函数会在被调用完后自动调用基类的析构函数清理基类成员,因为这样才能保证派生类对象先清理派生类成员,再清理基类成员的顺序
5.派生类对象初始化先调用基类构造,再调派生类构造(符合栈的先进后出)
6.派生类对象析构清理先调用派生路析构,再调基类析构(符合栈的先进后出)
7.因为后续一些场景析构函数需要构成重写,重写的条件之一是函数名相同(这个我们后面会讲 解)。那么编译器会对析构函数名进行特殊处理,处理成destrutor(),所以父类析构函数不加 virtual的情况下,子类析构函数和父类析构函数构成隐藏关系(多态内容)
class Person
{
public:Person(const char* name = "peter"): _name(name){cout << "Person()" << endl;}Person(const Person& p): _name(p._name){cout << "Person(const Person& p)" << endl;}Person& operator=(const Person& p){cout << "Person operator=(const Person& p)" << endl;if (this != &p)_name = p._name;return *this;}~Person(){cout << "~Person()" << endl;}
protected:string _name; // 姓名
};class Student : public Person
{
public:Student(const char* name, int num): Person(name), _num(num){cout << "Student()" << endl;}Student(const Student& s): Person(s), _num(s._num){cout << "Student(const Student& s)" << endl;}Student& operator = (const Student& s){cout << "Student& operator= (const Student& s)" << endl;if (this != &s){Person::operator =(s);_num = s._num;}return *this;}~Student(){cout << "~Student()" << endl;}
protected:int _num; //学号
};void Test()
{Student s1("jack", 18);Student s2(s1);Student s3("rose", 17);s1 = s3;
}
2.继承与友元
友元关系不能继承,也就是说基类友元不能访问派生类私有和保护成员
很简单理解,这里不贴代码了
3.继承与静态成员
基类定义了static静态成员,则整个继承体系里面只有一个这样的成员,无论拍成出多少个子类,都只有一个static成员
class Person
{
public:static int _count;
};int Person::_count = 0;class Student : public Person
{
public:int _id;
};void Test()
{Student s1;Student s2;Student s3;cout << Person::_count << endl;s1._count = 1;cout << Person::_count << endl;s2._count = 2;cout << Person::_count << endl;s3._count = 3;cout << Person::_count << endl;
}
新手写博客,有不对的位置希望大佬们能够指出,也谢谢大家能看到这里,让我们一起学习进步吧!
这篇关于C++从零开始的打怪升级之路(day41)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!