A . 继承概念
继承机制是面向对象的程序设计使得代码可以进行复用, 允许在原有的基础上进行扩展, 增加功能 。
//继承
#include <iostream>
#include <string>
using std :: cout;
using std :: endl;
using std :: string;
struct Person
{
public:
void Print()
{
cout << "姓名:> " << _name << endl;
cout << "年龄:> " << _age << endl;
}
string _name;
int _age;
};
class Student : public Person
{
protected:
int stuid; //学号
};
int main()
{
Student s;
Person p1 = s;
Person& rp = s;
rp._naem = "Alen";
Person* ptrp = &s;
Ptrp->_name = "Mike";
return 0;
}
----->注意 :>继承 --->类设计 层次的复用 。
---------->调试 过程 :>
----->NO 1.
----->NO 2.
B . 继承格式
------->格式如下 :>
------>以及 下列图示 :>
------>小结 :>
(1). 基类 private 成员在派生类当中是不能够被访问到的, 如果基类成员不想在类外面直接被访问, 但是需要在派生类中能够访问, 就定义成 protected 。可以看出, protected (保护限定符)因继承而出现 。
(2). 关键字 class 默认继承方式 private ; 而 struct 默认继承 public (建议 :显示出继承方式)
C . 基类 ~~ 派生类对象 赋值转换
--------->派生类对象 可以赋值给 基类的对象 / 基类的指针 / 基类的引用 。即, 切片 ~~ 切割 ;
意即, 可以将 派生类中 基类的那一部分切下来赋值过去 ;
--------->基类对象不能赋值给派生类对象 ;
--------->基类的指针 ~~ 基类的引用 可以通过强制类型转换赋值给派生类的指针 与引用 。但是 必须是基类的指针指向派生类对象 。
D .继承中的作用域
(1). 在继承体系中 基类 ~~ 派生类 都有独立的作用域 ;
(2). 基类 ~~ 派生类 有同名成员 --->隐藏 :> 子类成员将屏蔽掉 基类对同名成员的直接访问 ;
或是 重定义, 在子类成员函数中, 可以使用 基类 :: 基类成员 --->进行显示访问 。
(3). 注意 :>如果是成员函数的隐藏, 只需要 函数名相同就会构成隐藏 ;
--------------->在实际中, 继承体系里面最好不要定义 同名成员 。
------->隐藏 / 重定义 :>
//隐藏 / 重定义
#include <iostream>
#include <string>
using std :: cout;
using std :: endl;
using std :: string;
class Person
{
public:
void Func()
{
cout << "Person Func()" << endl;
}
protected:
string _name = "Alen";
int _num = 110;
};
class Student : public Person
{
public:
void Func()
{
cout << "Student Func()" << endl;
}
void Print()
{
cout <<_num << endl;
cout << _name << endl;
} //定义了同名函数
protected:
string _name = "Mike";
int _num = 999; //定义了同名变量
};
//测试检验
//
int main()
{
Student s;
s.Print();
s.Func();
return 0;
}
为了方便好友们, 有更好的观感体验, 现附上 彩色 代码图样 :>
E . 派生类的默认成员函数(共有 六个 )
--------->默认,即 编译器会自动生成
(a). 派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员 。如果基类没有默认的构造函数, 则必须在派生类的构造函数 --->进行初始化列表显示调用 ;
(b). 派生类的拷贝构造函数必须调用基类的拷贝构造函数完成基类的拷贝初始化 ;
(c). 派生类对象的析构清理, 会先去调用派生类的析构, 之后再调用基类的析构进行清理 ;
------->演示环节 :>
//派生类__默认成员函数
#include <iostream>
#include <string>
using std :: cout;
using std :: endl;
using std :: string;
class Person
{
public:
Person(const char* name)
:_name(name)
{
cout << "Person(const char* name)" << endl;
}
Person(const Person& p)
:_name(p._name)
{
cout << "Person(const Person& p)" << endl;
}
Person& operator=(const Person& p)
{
if(this != &p)
{
_name = p._name;
}
return *this;
}
~Person()
{
cout << "~Person()" << endl;
delete _pstr;
}
protected:
string _name;
string* _pstr = new string("0101010101");
};
class Student : public Person
{
public:
Student(const char* name = "Mike", int id = 12)
:Person(name)
,_id(id)
{}
Student(const Student& s)
:Person(s)
,_id(s._id)
{}
Student& operator=(const Student& s)
{
if(this != &s)
{
Person :: operator=(s);
_id = s._id;
}
return *this;
}
~Student()
{
cout << *_pstr << endl;
delete _ptr;
}
protected:
int _id;
int* _ptr = new int;
};
//测试
//
int main()
{
Student s1;
cout << endl;
Student s2(s1);
cout << endl;
Student s3("Alen", 1);
s1 = s3;
cout << endl;
return 0;
}
为了方便好友们, 有更好的观感体验, 现附上 彩色 代码图样 :>
-------->实现环节 :>
-------->测试环节 :>
各位好友, 本期 内容 已完结 !
下一期 展示新的 领域 ----->继承(多态) “敬请期待 !😊😊