本文共 4552 字,大约阅读时间需要 15 分钟。
13章 类的继承
c++ primer plus 学习心得分享
这里演示一个例子
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#includeusing 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应该是一样的,但是结果是不一样的,说明两者的变量存在不同的地方。下面是一个演示的例子
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"#includeint Base::GetAge(){ return this->age;}int Base::SetAge(int age){ this->age = age;}
demo.cpp 的代码
#include "share_lib.h"#includeusing 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$
会发现是一样的效果!
转载地址:http://seyci.baihongyu.com/