博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P24-c++类继承-01详细的例子演示继承的好处
阅读量:4047 次
发布时间:2019-05-25

本文共 4552 字,大约阅读时间需要 15 分钟。

文章目录

1. 继承的好处

13章 类的继承

c++ primer plus 学习心得分享

  1. 项目比较庞大和复杂的时候,使用经过测试过得代码要比重新编写代码要好的多
  2. 也比较好扩展,派生类 可以 继承原有类的特征, 正如继承一笔财产肯定是比自己白手起家容易很多。
  3. 不需要提供源码,依然可以使用在基类上面增加功能

这里演示一个例子

在这里插入图片描述

1.1 继承一笔财产肯定是比自己白手起家容易很多

Base 是一个 父类 , 然后 Base1 继承 Base类, 他是一个子类

Base类的实现, 只有一个简单的age成员变量

class Base {
private: int age;public: int GetAge() {
return this->age; } int SetAge (int age) {
this->age = age; }};

Base1是继承 Base类的,多加了一个成员变量counter

class Base1 : public Base {
private: int counter;public: int GetCounter() {
return counter; } int SetCounter (int counter) {
this->counter = counter; }};

怎么使用呢?

Benefit.cpp

#include 
using namespace std;class Base {
private: int age;public: int GetAge() {
return this->age; } int SetAge (int age) {
this->age = age; }};class Base1 : public Base {
private: int counter;public: int GetCounter() {
return counter; } int SetCounter (int counter) {
this->counter = counter; }};int main(int argc, char *argv[]){
Base base; base.SetAge(18); Base1 base1; base1.SetCounter(17); base1.SetAge(19); cout << "father:Base.GetAge():" << base.GetAge() << endl; cout << "son:Base1.GetAge():" << base1.GetAge() << endl; return 0;}
book@book-desktop:~/meng-yue/c++/inherit/01$ g++ -o Benefit Benefit.cppbook@book-desktop:~/meng-yue/c++/inherit/01$ ./Benefit

编译运行看一下结果

book@book-desktop:~/meng-yue/c++/inherit/01$ g++ -o Benefit Benefit.cppbook@book-desktop:~/meng-yue/c++/inherit/01$ ./Benefitfather:Base.GetAge():18son:Base1.GetAge():19book@book-desktop:~/meng-yue/c++/inherit/01$

可以发现 Base1这个子类 直接继承了 Base类的成员变量和成员方法,age,GetAge等,也不需要自己实现。

而且 子类Base1继承过来的 成员变量 age 和 父类 Base 的age变量是存在不同的地方,如果是同一个地方,Base1改了,两者打印出来的age应该是一样的,但是结果是不一样的,说明两者的变量存在不同的地方。

1.2 不提供源码行不行?

下面是一个演示的例子

在这里插入图片描述
share_lib.h 的代码

#ifndef SHARE_LIB_H_#define SHARE_LIB_H_class Base {
private: int age;public: int GetAge(); int SetAge (int age);};#endif

share_lib.cpp 的代码实现

#include "share_lib.h"#include 
int Base::GetAge(){
return this->age;}int Base::SetAge(int age){
this->age = age;}

demo.cpp 的代码

#include "share_lib.h"#include 
using namespace std;class Base1 : public Base {
private: int counter;public: int GetCounter() {
return counter; } int SetCounter (int counter) {
this->counter = counter; }};int main(int argc, char *argv[]){
Base base; base.SetAge(18); Base1 base1; base1.SetCounter(17); base1.SetAge(19); cout << "father:Base.GetAge():" << base.GetAge() << endl; cout << "son:Base1.GetAge():" << base1.GetAge() << endl; return 0;}

编译的结果:

book@book-desktop:~/meng-yue/c++/inherit/02$ g++ -o demo demo.cpp share_lib.cppbook@book-desktop:~/meng-yue/c++/inherit/02$ ./demofather:Base.GetAge():18son:Base1.GetAge():19book@book-desktop:~/meng-yue/c++/inherit/02$

跟01的例子结果是一样的!

将 share_lib.cpp 编译成动态库使用

book@book-desktop:~/meng-yue/c++/inherit/02$ g++ -fPIC -shared -o libshare_lib.so share_lib.cpp
book@book-desktop:~/meng-yue/c++/inherit/02$ g++ -fPIC -shared -o libshare_lib.so share_lib.cppbook@book-desktop:~/meng-yue/c++/inherit/02$ lsdemo.cpp  libshare_lib.so  share_lib.cpp  share_lib.hbook@book-desktop:~/meng-yue/c++/inherit/02$ ^Cbook@book-desktop:~/meng-yue/c++/inherit/02$

生成了一个动态的库,直接使用这个库,别人是看不见代码的!使用的时候,直接分享给他头文件即可!

那怎么使用这个动态库来生成可执行文件呢?

book@book-desktop:~/meng-yue/c++/inherit/02$ g++ -o use_share_lib demo.cpp -lshare_lib -L.

生成了可执行文件,看上面的命令,发现不需要源码,仍然能够自己进行扩展。

book@book-desktop:~/meng-yue/c++/inherit/02$ lsdemo.cpp  libshare_lib.so  share_lib.cpp  share_lib.h  use_share_libbook@book-desktop:~/meng-yue/c++/inherit/02$

然后运行看一下效果!

book@book-desktop:~/meng-yue/c++/inherit/02$ ./use_share_lib./use_share_lib: error while loading shared libraries: libshare_lib.so: cannot open shared object file: No such file or directorybook@book-desktop:~/meng-yue/c++/inherit/02$

结果报错了,怎么解决这个问题呢?

得把当前的路径放到动态库加载路径里面,要不然系统不知道你这个动态库在当前目录下面

book@book-desktop:~/meng-yue/c++/inherit/02$ sudo vim /etc/ld.so.confbook@book-desktop:~/meng-yue/c++/inherit/02$ cat /etc/ld.so.confinclude /etc/ld.so.conf.d/*.conf/home/book/meng-yue/c++/inherit/02/book@book-desktop:~/meng-yue/c++/inherit/02$

在/etc/ld.so.conf 里面,把自己动态库的路径放进去, 我这里是

/home/book/meng-yue/c++/inherit/02/

然后运行下面这个命令,重新加载一个动态库的路径

book@book-desktop:~/meng-yue/c++/inherit/02$ sudo ldconfig

这个时候在运行一下可执行程序

book@book-desktop:~/meng-yue/c++/inherit/02$ ./use_share_libfather:Base.GetAge():18son:Base1.GetAge():19book@book-desktop:~/meng-yue/c++/inherit/02$

会发现是一样的效果!

2. 去哪获取笔记和详细的资料

在这里插入图片描述

2.1 微信公众号,梦悦foundation

在这里插入图片描述

2.2 公众号里点击IT资源,有链接

2.3 后台回复 c++资料

2.4 加up主微信,进学习交流群,大家一起带你飞!

在这里插入图片描述

3. 获取到的笔记怎么使用

3.1 pdf文件

3.2 html格式文件

3.1 蚂蚁笔记

3.2 印象笔记

在这里插入图片描述

转载地址:http://seyci.baihongyu.com/

你可能感兴趣的文章
最简单的使用redis自带程序实现c程序远程访问redis服务
查看>>
redis学习总结-- 内部数据 字符串 链表 字典 跳跃表
查看>>
iOS 对象序列化与反序列化
查看>>
iOS 序列化与反序列化(runtime) 01
查看>>
iOS AFN 3.0版本前后区别 01
查看>>
iOS ASI和AFN有什么区别
查看>>
iOS QQ侧滑菜单(高仿)
查看>>
iOS 扫一扫功能开发
查看>>
iOS app之间的跳转以及传参数
查看>>
iOS __block和__weak的区别
查看>>
Android(三)数据存储之XML解析技术
查看>>
Spring JTA应用之JOTM配置
查看>>
spring JdbcTemplate 的若干问题
查看>>
Servlet和JSP的线程安全问题
查看>>
GBK编码下jQuery Ajax中文乱码终极暴力解决方案
查看>>
Oracle 物化视图
查看>>
PHP那点小事--三元运算符
查看>>
解决国内NPM安装依赖速度慢问题
查看>>
Brackets安装及常用插件安装
查看>>
Centos 7(Linux)环境下安装PHP(编译添加)相应动态扩展模块so(以openssl.so为例)
查看>>