太原建网站公司,ppt电子商务网站建设,网站设计为什么要域名,做兼职一般去哪个网站好提示#xff1a;继承基础概念 文章目录 一、继承1.1 基础概念1.2 继承作用与继承方式1.2 继承中的隐藏1.3 类中构造、析构在继承方面知识1.4 继承知识拓展 一、继承
1.1 基础概念
继承机制是面向对象程序设计使代码可以复用的最重要的手段#xff0c;它允许在保持原有类特性… 提示继承基础概念 文章目录 一、继承1.1 基础概念1.2 继承作用与继承方式1.2 继承中的隐藏1.3 类中构造、析构在继承方面知识1.4 继承知识拓展 一、继承
1.1 基础概念
继承机制是面向对象程序设计使代码可以复用的最重要的手段它允许在保持原有类特性的基础上进行扩展增加功能这样产生新的类称派生类继承呈现了面向对象程序设计的层次结构体现了由简单到复杂的认知过程。
1.2 继承作用与继承方式
//继承定义-派生类 继承方式-基类
class Student:public Person类成员/继承方式public继承protected继承private继承基类的public成员派生类的public成员派生类的protected成员派生类的private成员基类的protected成员派生类的protected成员派生类的protected成员派生类的private成员基类的private成员派生类中不可见派生类中不可见派生类中不可见
继承又分类为继承方式与访问限定。 继承与访问都适用于向下兼容。 总结
基类private私有成员在派生类中无论以什么方式继承都是不可见的这里的不可见是指基类的私有成员还是被继承到派生类对象中但语法上限制派生类对象不管在类里面还是类外面都不能去访问它。基类中不想再类外直接被访问又需要再派生类中能访问就可以定义为protected保护。保护成员限定符是因为继承才出现的。protected一种VIP机制限定了一部分人的访问权限又让另一部分人可以访问到。基类除了私有成员其他成员都是向下兼容的。实际中多用publicprotected与private意义不大。
1.2 继承中的隐藏
概念如果子类和基类存在相同名称的成员当使用派生类对象想用该同名称的成员时优先调用的是子类的基类的无法直接被调用到相当于子类将基类中同名成员屏蔽了。 同名隐藏需要注意的点 基类与子类的关系且隶属于不同的作用域若想要通过子类对象调用相同名称的基类成员必须在该成员前加基类名称以及作用域限定符。 **成员变量隐藏**只与成员变量名是否相同有关与成员变量类型是否相同无关。 **成员函数隐藏**只与函数名是否相同有关于幻术原型是否相同无关。
1.3 类中构造、析构在继承方面知识
派生类对象构造时 虽然是派生类构造但是会有优先构造基类对象的成员函数函数调用的过程 调用派生类构造函数–然后再派生类构造函数初始化列表的位置调用基类构造函数完成基类部分成员的初始化工作–然后才执行派生类构造函数函数体。 当无实例化的基类或派生类构造函数时因为是类的默认成员函数所以会自动生成默认成员函数 派生类对象析构时 析构哪个类的对象编译器就会调用那个类的析构函数析构的过程是先调用派生类的析构函数完成派生类中资源的清理然后编译器再派生类析构函数最后一句插入call基类析构函数的汇编指令才会执行基类的析构函数以完成清理。 派生类析构–基类析构
1.4 继承知识拓展
继承有非常多种的方式例如 单继承、多继承、菱形继承、虚拟继承、菱形虚拟继承 **单继承**普通继承方式 **多继承**指一个类可以继承多个父类特征从而复用这些父类的组成于方法或扩展父类的功能。 **菱形继承**多继承的一种菱形继承是一种错误的类继承使用方式指的是再类中有部分继承过程产生了像菱形一样的继承关系。这样在使用类D时类D中就会有两份类A的关系链路就会出现名称冲突了内存浪费二意性等等的问题。
// 同时还会引发更大的问题 二义性
#include iostreamclass person
{
public:std::string _name;
};
class student : public person
{
protected:int _num;
};
class teacher : public person
{
protected:int _id;
};
class start : public student, public teacher
{std::string _course;
};int main()
{// 二义性的由来start a;错误 -- a._name zhangsan;只能 -- a.student::_name xxx;或者 -- a.teacher::_name yyy;return 0;
}
专职赋值才可以
**虚拟继承**虚拟继承是C中为了解决菱形继承而出现的虚拟继承的实现方式
class A{
// A成员
}
class B : virtual public A{
// B成员
}
class C : virtual public A{
// C成员
}
class D : public B,public C{
// D成员
}
---------------------------------------------------
class person
{
public:std::string _name;
};
class student : virtual public person
{
protected:int _num;
};
class teacher : virtual public person
{
protected:int _id;
};
class start : public student, public teacher
{std::string _course;
};int main()
{start a;a._name zhangsan; // 当为虚拟继承时可以正常编译//a.student::_name xxx;//a.teacher::_name yyy;return 0;
} 虚拟继承在派生类中使用virtual来指定虚拟继承它保证了在派生类中只有一份共享的基类子对象。