百度网站大全旧版,单页产品销售网站如何做推广,门户网站开发使用什么语言,爬虫 网站开发实例你好#xff0c;这里是争做图书馆扫地僧的小白。 个人主页#xff1a;争做图书馆扫地僧的小白_-CSDN博客 目标#xff1a;希望通过学习技术#xff0c;期待着改变世界。 提示#xff1a;以下是本篇文章正文内容#xff0c;下面案例可供参考 文章目录 前言 一、继承关系… 你好这里是争做图书馆扫地僧的小白。 个人主页争做图书馆扫地僧的小白_-CSDN博客 目标希望通过学习技术期待着改变世界。 提示以下是本篇文章正文内容下面案例可供参考 文章目录 前言 一、继承关系的语法形式 一单继承的语法格式 二多继承的语法形式 三单继承关系举例 二、继承关系的意义 三、继承关系的权限问题 四、单继承 一单继承关系下的内存布局 1.举个例子代码如下 2.图解如下 二自动隐藏机制 三继承关系下的类型兼容规则 五、多继承 一多继承举例说明 二多继承的内存布局 总结 前言 随着技术的革新出现各种各样的编程语言C就是其中之一作为最受欢迎的编程语言之一C带给开发者们最大的惊喜便是其强大的特性。一方面跟C兼容可以直面系统底层APISDK另一方面提供了很多范式足够的抽象能力面向对象操作符重载模板等。 之前的C学习笔记十一------has_a和use_a关系-CSDN博客已经讲解了has_a和use_a关系本篇将讲解最为重要的一种关系即is_a关系继承关系。 一、继承关系的语法形式 一单继承的语法格式
class 子类 继承权限 父类
{//继承即是子类继承了父类中的所有属性与方法构造函数除外
}; 二多继承的语法形式
class 子类 继承权限1父类1继承权限2父类2... 继承权限n父类n
{//子类继承多个父类中的所有属性与方法。
} 注意继承关系中子类并不继承父类中的构造函数。因为构造函数是特别的为本类域进行初始化的函数并不会被继承。子类中要有子类的默认构造或自定义有参构造。 多继承一般情况不使用如果使用多用于集成多个抽象类原因见下文的多继承部分。 三单继承关系举例
#include iostream
using namespace std;
class Car
{
public:int price;
public:void run(){cout 汽车在行驶 endl;}
};
class BYD : public Car
{
public:void uniqueEmblem(){cout 有着中国特色的车标 endl;}
};
int main()
{BYD bydbyd.run();byd.price;byd.uniqueEmblem();return 0;
}
二、继承关系的意义 继承关系的意义是代码复用性与高拓展性。 使用继承关系的步骤首先把这类的事件抽象出来一些共有的属性与特征把它们定义为父类。再用这个父类对具有不同特点的子类进行派生就可以派生出各种不同的子类。这样的子类有着公有的属性还有着各自独特的性质。
三、继承关系的权限问题
#include iostream
using namespace std;class Car
{
public:int price;
public:void run(){cout 汽车在行驶 endl;}
};class BYD : private Car
{
public:void uniqueEmblem(){cout 有着中国特色的车标 endl;}
};int main()
{BYD bydbyd.run();byd.price;byd.uniqueEmblem();return 0;
}继承关系图如下所示如图所示当子类继承父类时可以理解为将父类整体打包将其作为一整个属性赋给子类。 注意每一种继承关系对父类各种权限的属性的访问也是有区别的。当public继承时对父类中private权限的属性不管是在子类的类外还是类内都没有访问权限对父类中protected权限的属性在子类的类内有访问权限且为protected访问权限在子类类外没有访问权限对父类中public属性的属性不管是在子类类内还是类外都是public访问权限。其余两种不在采用文字形式进行描述详细的直观的描述见下面的表格。 四、单继承 一单继承关系下的内存布局 子类对象被构造时先构造父类然后再调用子类的构造完成对子类类域中拓展的属性进行初始化此时子类的对象具有具体初始值。析构的时候先析构子类然后在析构父类。 注意的是子类析构被执行父类析构也一定被析构。原因是内存绑定 1.举个例子代码如下
#include iostream
using namespace std;
class Car
{
private:int price;
public:void run(){cout 汽车在行驶 endl;}Car(){cout Car父类的构造 endl;}~Car(){cout Car父类的析构 endl;}
};
class BYD : private Car
{
public:BYD(){cout BYD子类的构造 endl;}~BYD(){cout BYD子类的析构 endl;}
};int main()
{BYD byd;return 0;
}2.图解如下 二自动隐藏机制 当子类中有与父类同名属性或函数时父类中的同名属性或行为将自动隐藏在自己的父类的类域之中如果想访问父类类域之中的属性或行为就使用域名::访问。 举个例子代码如下
#include iostream
#include unistd.h
using namespace std;
class Car
{
public:int price 10000;
public:void run(){cout 车子正在行驶之中 endl;}Car(){cout Car父类的构造 endl;}~Car(){cout Car父类的析构 endl;}
};class BYD : public Car
{
public:int weight 20000;
public:void run(){cout BYD高速行驶 endl;}BYD(){cout BYD子类的构造 endl;}~BYD(){cout BYD子类的析构 endl;}
};
int main()
{BYD byd;cout byd.Car::price endl;byd.run();byd.Car::run();return 0;
}
三继承关系下的类型兼容规则 在之前我们学到当使用指针的时候要保证等号前后的指针类型要相同才可以在继承中不然。继承关系中父类指针或者引用可以安全的指向或者引用子类类型的对象但是子类指针或者引用并不能指向或者引用父类类型的对象。 需要注意的是使用父类指针在释放资源时注意要强转成子类指针才可以完全释放不然会造成资源的泄露。 还需要注意的是当父类中只有有参构造的时候子类的构造函数处应该进行初始化列表的操作指定父类的有参构造对其进行初始化操作否则会报错。 举个例子代码如下
#include iostream
#include unistd.h
using namespace std;
class Car
{
public:int price 10000;
public:void run(){cout 汽车在行驶 endl;}Car(int price){cout Car父类的构造 endl;}~Car(){cout Car父类的析构 endl;}
};
class BYD : public Car
{
public:int price 20000;
public:void run(){cout BYD高速行驶 endl;}BYD():Car(1) {cout BYD子类的构造 endl;}~BYD(){cout BYD子类的析构 endl;}
};
int main()
{//栈上定义对象BYD byd;Car* c byd; //父类属性的指针可以安全的指向子类属性c-run(); //调用父类中子类和父类公有的run方法cout c-price endl; //10000Car ref_c byd; //父类属性的引用可以安全的指向子类属性ref_c.run(); //调用父类中子类和父类公有的run方法cout ref_c.price endl; //10000//用堆上的对象Car* ptr_c new BYD();ptr_c-run();delete (BYD*)ptr_c; //释放指针时需要进行强转否则只采用delete ptr_c只会析构父类而子类指向的堆上资源并没有被回收return 0;
}五、多继承 在多继承时虽然多继承可以大在提高代码的复用性但是会造成代码冗余当多个父类中有同名函数或属性时在访问时候会出现二义性的问题。 需要注意使用类域::访问的方式进行指定访问但是这样给程序设计带来很多不便所以多继承在开发时尽量避免。如果一定要使用多继承时推荐使用多继承多个抽象类因为抽象类一般都没有具体的属性只有纯虚函数。 一多继承举例说明
#include iostream
using namespace std;
class Phone
{
public:int power;
public:void sendMessage(){cout 发消息 endl;}
};
class Pad
{
public:int power;
public:void playGame(){cout 玩游戏 endl;}
};
class Computer : public Phone, public Pad
{};
int main()
{Computer computer;computer.sendMessage();computer.playGame();cout computer.Phone::power endl; cout sizeof(Computer) endl;return 0;
}二多继承的内存布局 注意当上述例子中定义Phone *p computer 和 Pad *p1 computer 这两个指针指向的地址空间是否一致 答案是不一致的当使用父类指针指向子类时在继承中父类指针永远指向的是自己类中的起始地址。 当然多继承也符合继承关系下的类型兼容规则。 总结 以上就是今天要讲的内容本文将is_a关系继承关系进行了详细的介绍分成了单继承和多继承并对继承中权限问题和内存布局进行了详细的介绍当然多继承中还存在着一种特殊的构造形式即为菱形继承这部分将留作下篇笔记进行撰写。