什么是继承
(1)继承是C++源生支持的一种语法特性,是C++面向对象的一种表现
(2)继承特性可以让派生类“瞬间”拥有基类的所有(当然还得考虑权限)属性和方法
(3)继承特性本质上是为了代码复用
(4)类在C++编译器的内部可以理解为结构体,派生类是由基类成员叠加派生类新成员得到的
派生类又叫子类,基类又叫父类。两种叫法都有人常用,我们后面会混用,锻炼大家瞬间了然的能力
继承中的权限管控
C++类中的访问权限管控回顾
(1)public 类内部可以访问,类的外部可以访问
(2)private 类内部可以访问,类的外部不能访问
(3)protected 类内部可以访问,类的外部不能访问
1、父类的private成员,在三种继承下都会被变成在子类中是比private还可怜的这种成员
2、父类的public成员,在public继承下到子类中还是public,在protected继承下到子类中是protected的,在private继承下到子类中是private的。
3、父类的protected成员,在public继承下到子类中是protected的,在protected继承下到子类中是protected的,在private继承下到子类中是private的。
4、private:如果是父类中的private权限成员,那么在继承时会被降到比private还惨的这种;而如果是private继承,则不会导致父类中public和protected的成员降权到比private还惨的这种,只会降级到private权限。
5、在继承中父类中所有的成员(不管哪种权限)都会被继承给子类,而不会丢失任何一个。
派生类和基类的构造析构关系
派生类并不继承基类的构造和析构函数,只继承成员变量和普通成员方法
派生类的构造函数一定会调用基类的构造函数,析构也一样
#include <iostream>
// 基类
class Animal {
public:
// 带参数的基类构造函数
Animal(const std::string& name) : name_(name) {
std::cout << "Animal constructor called for " << name_ << std::endl;
}
// 基类析构函数
virtual ~Animal() {
std::cout << "Animal destructor called for " << name_ << std::endl;
}
private:
std::string name_;
};
// 派生类
class Pigeon : public Animal {
public:
// 带参数的派生类构造函数
Pigeon(const std::string& name, int age) : Animal(name), age_(age) {
std::cout << "Pigeon constructor called for " << name << " aged " << age_ << std::endl;
}
// 派生类析构函数
~Pigeon() {
std::cout << "Pigeon destructor called for age " << age_ << std::endl;
}
private:
int age_;
};
int main() {
Pigeon p("Polly", 3);
return 0;
}
为什么派生类的构造(析构)必须调用基类的某个构造(析构)
(1)牢记构造函数的2大作用:初始化成员,分配动态内存
(2)派生类和基类各自有各自的构造函数和析构函数,所以是各自管理各自的成员初始化,各自分配和释放各自所需的动态内存
(3)继承的语言特性,允许派生类调用基类的构造和析构函数,以管理派生类从基类继承而来的那些成员。
(4)明确:派生类的构造和析构处理的永远是派生类自己的对象,只是派生类对象模板中有一部分是从基类继承而来的而已。
总结:
理解继承是什么
继承时是全部继承方法和属性
方法和属性的权限分三类private、public、protected
继承时会导致方法和属性的权限被改变
理解继承的体系设计原理
理解派生类会怎么样调用基类的构造、析构函数
学习记录,侵权联系删除。
来源:朱老师物联网大课堂