P24-c++类继承-01详细的例子演示继承的好处

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 <iostream>

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.cpp
book@book-desktop:~/meng-yue/c++/inherit/01$ ./Benefit

编译运行看一下结果

book@book-desktop:~/meng-yue/c++/inherit/01$ g++ -o Benefit Benefit.cpp
book@book-desktop:~/meng-yue/c++/inherit/01$ ./Benefit
father:Base.GetAge():18
son:Base1.GetAge():19
book@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 <iostream>

int Base::GetAge()
{
	return this->age;
}

int Base::SetAge(int age)
{
	this->age = age;
}


demo.cpp 的代码

#include "share_lib.h"
#include <iostream>

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.cpp
book@book-desktop:~/meng-yue/c++/inherit/02$ ./demo
father:Base.GetAge():18
son:Base1.GetAge():19
book@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.cpp
book@book-desktop:~/meng-yue/c++/inherit/02$ ls
demo.cpp  libshare_lib.so  share_lib.cpp  share_lib.h
book@book-desktop:~/meng-yue/c++/inherit/02$ ^C
book@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$ ls
demo.cpp  libshare_lib.so  share_lib.cpp  share_lib.h  use_share_lib
book@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 directory
book@book-desktop:~/meng-yue/c++/inherit/02$

结果报错了,怎么解决这个问题呢?
得把当前的路径放到动态库加载路径里面,要不然系统不知道你这个动态库在当前目录下面

book@book-desktop:~/meng-yue/c++/inherit/02$ sudo vim /etc/ld.so.conf
book@book-desktop:~/meng-yue/c++/inherit/02$ cat /etc/ld.so.conf
include /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_lib
father:Base.GetAge():18
son:Base1.GetAge():19
book@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 印象笔记

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值