文章目录
1. 继承的好处
13章 类的继承
c++ primer plus 学习心得分享
- 项目比较庞大和复杂的时候,使用经过测试过得代码要比重新编写代码要好的多
- 也比较好扩展,派生类 可以 继承原有类的特征, 正如继承一笔财产肯定是比自己白手起家容易很多。
- 不需要提供源码,依然可以使用在基类上面增加功能
这里演示一个例子
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$
会发现是一样的效果!