C++两种线程模式:委托和继承(附示例)

简介: 继承方式实现简单,请参见:https://github.com/eyjian/mooon/blob/master/common_library/include/mooon/sys/thread.
继承方式实现简单,请参见: https://github.com/eyjian/mooon/blob/master/common_library/include/mooon/sys/thread.h

在C++11标准之前的实现较为复杂(可参见: https://github.com/eyjian/mooon/blob/master/common_library/include/mooon/sys/thread_engine.h):

委托版本使用非常简单:

点击(此处)折叠或打开

  1. static void hello(int m, int n)
  2. {
  3.     printf("[%u] hello: %d/%d\n", pthread_self(), m, n);
  4. }

  5. class X
  6. {
  7. public:
  8.     void world(int m, int n, int l)
  9.     {
  10.         printf("[%u] X::world: %d/%d/%d\n", pthread_self(), m, n, l);
  11.     }
  12. };

  13. int main()
  14. {
  15.     X* x2 = new X;

  16.     // 带2个参数
  17.     CThreadEngine engine9(bind(&hello, 2015, 5));

  18.     // 带3个参数
  19.     CThreadEngine engine16(bind(&X::world, x2, 2016, 5, 3));
  20.     return 0;
  21. }

委托版本实现:
  1. #ifndef MOOON_SYS_THREAD_ENGINE_H
  2. #define MOOON_SYS_THREAD_ENGINE_H

  3. // 如果测试,请不需注释掉TEST_THREAD_ENGINE的定义
  4. //#define TEST_THREAD_ENGINE 1

  5. #if !defined(TEST_THREAD_ENGINE)
  6. #include "mooon/sys/config.h" // 如果需要脱离mooon运行,请注释掉这行
  7. #endif // TEST_THREAD_ENGINE

  8. #include pthread.h>
  9. #include stdio.h>
  10. #include unistd.h>

  11. #if defined(TEST_THREAD_ENGINE)
  12. #define SYS_NAMESPACE_BEGIN
  13. #define SYS_NAMESPACE_END
  14. #endif // TEST_THREAD_ENGINE
  15. SYS_NAMESPACE_BEGIN

  16. // 基类
  17. class Function
  18. {
  19. public:
  20.     virtual ~Function() {}
  21.     virtual void operator ()() = 0;
  22. };

  23. ////////////////////////////////////////////////////////////////////////////////
  24. // 不带参数

  25. class FunctionWithoutParameter: public Function
  26. {
  27. public:
  28.     // 不使用返回值,所以不需要返回值,否则将void替换成需要的类型
  29.     typedef void (*FunctionPtr)();

  30.     FunctionWithoutParameter(FunctionPtr function_ptr)
  31.         : _function_ptr(function_ptr)
  32.     {
  33.     }

  34.     virtual void operator ()()
  35.     {
  36.         (*_function_ptr)();
  37.     }
  38.     
  39. private:
  40.     FunctionPtr _function_ptr;
  41. };

  42. template class ObjectType>
  43. class MemberFunctionWithoutParameter: public Function
  44. {
  45. public:
  46.     typedef void (ObjectType::*MemberFunctionPtr)();
  47.     MemberFunctionWithoutParameter(MemberFunctionPtr member_function_ptr, ObjectType* object)
  48.         : _member_function_ptr(member_function_ptr), _object(object)
  49.     {
  50.     }
  51.     
  52.     virtual void operator ()()
  53.     {
  54.         (_object->*_member_function_ptr)();
  55.     }
  56.     
  57. private:
  58.     MemberFunctionPtr _member_function_ptr;
  59.     ObjectType* _object;
  60. };

  61. ////////////////////////////////////////////////////////////////////////////////
  62. // 带1个参数

  63. template typename ParameterType>
  64. class FunctionWith1Parameter: public Function
  65. {
  66. public:
  67.     typedef void (*FunctionPtr)(ParameterType);

  68.     FunctionWith1Parameter(FunctionPtr function_ptr, ParameterType parameter)
  69.         : _function_ptr(function_ptr), _parameter(parameter)
  70.     {
  71.     }

  72.     virtual void operator ()()
  73.     {
  74.         (*_function_ptr)(_parameter);
  75.     }
  76.     
  77. private:
  78.     FunctionPtr _function_ptr;
  79.     ParameterType _parameter;
  80. };

  81. template class ObjectType, typename ParameterType>
  82. class MemberFunctionWith1Parameter: public Function
  83. {
  84. public:
  85.     typedef void (ObjectType::*MemberFunctionPtr)(ParameterType);
  86.     MemberFunctionWith1Parameter(MemberFunctionPtr member_function_ptr, ObjectType* object, ParameterType parameter)
  87.         : _member_function_ptr(member_function_ptr), _object(object), _parameter(parameter)
  88.     {
  89.     }
  90.     
  91.     virtual void operator ()()
  92.     {
  93.         (_object->*_member_function_ptr)(_parameter);
  94.     }
  95.     
  96. private:
  97.     MemberFunctionPtr _member_function_ptr;
  98.     ObjectType* _object;
  99.     ParameterType _parameter;
  100. };

  101. ////////////////////////////////////////////////////////////////////////////////
  102. // 带2个参数

  103. template typename Parameter1Type, typename Parameter2Type>
  104. class FunctionWith2Parameter: public Function
  105. {
  106. public:
  107.     typedef void (*FunctionPtr)(Parameter1Type, Parameter2Type);

  108.     FunctionWith2Parameter(FunctionPtr function_ptr, Parameter1Type parameter1, Parameter2Type parameter2)
  109.         : _function_ptr(function_ptr), _parameter1(parameter1), _parameter2(parameter2)
  110.     {
  111.     }

  112.     virtual void operator ()()
  113.     {
  114.         (*_function_ptr)(_parameter1, _parameter2);
  115.     }

  116. private:
  117.     FunctionPtr _function_ptr;
  118.     Parameter1Type _parameter1;
  119.     Parameter2Type _parameter2;
  120. };

  121. template class ObjectType, typename Parameter1Type, typename Parameter2Type>
  122. class MemberFunctionWith2Parameter: public Function
  123. {
  124. public:
  125.     typedef void (ObjectType::*MemberFunctionPtr)(Parameter1Type, Parameter2Type);
  126.     MemberFunctionWith2Parameter(MemberFunctionPtr member_function_ptr, ObjectType* object, Parameter1Type parameter1, Parameter2Type parameter2)
  127.         : _member_function_ptr(member_function_ptr), _object(object), _parameter1(parameter1), _parameter2(parameter2)
  128.     {
  129.     }

  130.     virtual void operator ()()
  131.     {
  132.         (_object->*_member_function_ptr)(_parameter1, _parameter2);
  133.     }

  134. private:
  135.     MemberFunctionPtr _member_function_ptr;
  136.     ObjectType* _object;
  137.     Parameter1Type _parameter1;
  138.     Parameter2Type _parameter2;
  139. };

  140. ////////////////////////////////////////////////////////////////////////////////
  141. // 带3个参数

  142. template typename Parameter1Type, typename Parameter2Type, typename Parameter3Type>
  143. class FunctionWith3Parameter: public Function
  144. {
  145. public:
  146.     typedef void (*FunctionPtr)(Parameter1Type, Parameter2Type, Parameter3Type);

  147.     FunctionWith3Parameter(FunctionPtr function_ptr, Parameter1Type parameter1, Parameter2Type parameter2, Parameter3Type parameter3)
  148.         : _function_ptr(function_ptr), _parameter1(parameter1), _parameter2(parameter2), _parameter3(parameter3)
  149.     {
  150.     }

  151.     virtual void operator ()()
  152.     {
  153.         (*_function_ptr)(_parameter1, _parameter2, _parameter3);
  154.     }

  155. private:
  156.     FunctionPtr _function_ptr;
  157.     Parameter1Type _parameter1;
  158.     Parameter2Type _parameter2;
  159.     Parameter3Type _parameter3;
  160. };

  161. template class ObjectType, typename Parameter1Type, typename Parameter2Type, typename Parameter3Type>
  162. class MemberFunctionWith3Parameter: public Function
  163. {
  164. public:
  165.     typedef void (ObjectType::*MemberFunctionPtr)(Parameter1Type, Parameter2Type, Parameter3Type);
  166.     MemberFunctionWith3Parameter(MemberFunctionPtr member_function_ptr, ObjectType* object, Parameter1Type parameter1, Parameter2Type parameter2, Parameter3Type parameter3)
  167.         : _member_function_ptr(member_function_ptr), _object(object), _parameter1(parameter1), _parameter2(parameter2), _parameter3(parameter3)
  168.     {
  169.     }

  170.     virtual void operator ()()
  171.     {
  172.         (_object->*_member_function_ptr)(_parameter1, _parameter2, _parameter3);
  173.     }

  174. private:
  175.     MemberFunctionPtr _member_function_ptr;
  176.     ObjectType* _object;
  177.     Parameter1Type _parameter1;
  178.     Parameter2Type _parameter2;
  179.     Parameter3Type _parameter3;
  180. };

  181. ////////////////////////////////////////////////////////////////////////////////
  182. class Functor
  183. {
  184. public:
  185.     Functor()
  186.         : _function(NULL)
  187.     {
  188.     }
  189.     
  190.     Functor(const Functor& other)
  191.     {
  192.         _function = other._function;
  193.         
  194.         Functor& mutable_other = const_castFunctor&>(other);
  195.         mutable_other._function = NULL;
  196.     }

  197.     ~Functor()
  198.     {
  199.         delete _function;
  200.     }

  201.     Functor& operator =(const Functor& other)
  202.     {
  203.         _function = other._function;
  204.         
  205.         Functor& mutable_other = const_castFunctor&>(other);
  206.         mutable_other._function = NULL;

  207.         return *this;
  208.     }
  209.     
  210.     void operator ()()
  211.     {
  212.         (*_function)();
  213.     }
  214.     
  215.     // 不带参数
  216.     Functor(FunctionWithoutParameter::FunctionPtr function_ptr)
  217.     {
  218.         _function = new FunctionWithoutParameter(function_ptr);
  219.     }

  220.     template class ObjectType>
  221.     Functor(typename MemberFunctionWithoutParameterObjectType>::MemberFunctionPtr member_function_ptr, ObjectType* object)
  222.     {
  223.         _function = new MemberFunctionWithoutParameterObjectType>(member_function_ptr, object);
  224.     }
  225.    
  226.     // 带1个参数
  227.     template typename ParameterType>
  228.     Functor(typename FunctionWith1ParameterParameterType>::FunctionPtr function_ptr, ParameterType parameter)
  229.     {
  230.         _function = new FunctionWith1ParameterParameterType>(function_ptr, parameter);
  231.     }

  232.     template class ObjectType, typename ParameterType>
  233.     Functor(typename MemberFunctionWith1ParameterObjectType, ParameterType>::MemberFunctionPtr member_function_ptr, ObjectType* object, ParameterType parameter)
  234.     {
  235.         _function = new MemberFunctionWith1ParameterObjectType, ParameterType>(member_function_ptr, object, parameter);
  236.     }

  237.     // 带2个参数
  238.     template typename Parameter1Type, typename Parameter2Type>
  239.     Functor(typename FunctionWith2ParameterParameter1Type, Parameter2Type>::FunctionPtr function_ptr, Parameter1Type parameter1, Parameter2Type parameter2)
  240.     {
  241.         _function = new FunctionWith2ParameterParameter1Type, Parameter2Type>(function_ptr, parameter1, parameter2);
  242.     }

  243.     template class ObjectType, typename Parameter1Type, typename Parameter2Type>
  244.     Functor(typename MemberFunctionWith2ParameterObjectType, Parameter1Type, Parameter2Type>::MemberFunctionPtr member_function_ptr, ObjectType* object, Parameter1Type parameter1, Parameter2Type parameter2)
  245.     {
  246.         _function = new MemberFunctionWith2ParameterObjectType, Parameter1Type, Parameter2Type>(member_function_ptr, object, parameter1, parameter2);
  247.     }

  248.     // 带3个参数
  249.     template typename Parameter1Type, typename Parameter2Type, typename Parameter3Type>
  250.     Functor(typename FunctionWith3ParameterParameter1Type, Parameter2Type, Parameter3Type>::FunctionPtr function_ptr, Parameter1Type parameter1, Parameter2Type parameter2, Parameter3Type parameter3)
  251.     {
  252.         _function = new FunctionWith3ParameterParameter1Type, Parameter2Type, Parameter3Type>(function_ptr, parameter1, parameter2, parameter3);
  253.     }

  254.     template class ObjectType, typename Parameter1Type, typename Parameter2Type, typename Parameter3Type>
  255.     Functor(typename MemberFunctionWith3ParameterObjectType, Parameter1Type, Parameter2Type, Parameter3Type>::MemberFunctionPtr member_function_ptr, ObjectType* object, Parameter1Type parameter1, Parameter2Type parameter2, Parameter3Type parameter3)
  256.     {
  257.         _function = new MemberFunctionWith3ParameterObjectType, Parameter1Type, Parameter2Type, Parameter3Type>(member_function_ptr, object, parameter1, parameter2, parameter3);
  258.     }

  259. public:
  260.     Function* _function;
  261. };

  262. ////////////////////////////////////////////////////////////////////////////////
  263. // 不带参数

  264. Functor bind(FunctionWithoutParameter::FunctionPtr function_ptr)
  265. {
  266.     return Functor(function_ptr);
  267. }

  268. template class ObjectType>
  269. Functor bind(typename MemberFunctionWithoutParameterObjectType>::MemberFunctionPtr member_function_ptr, ObjectType* object)
  270. {
  271.     return Functor(member_function_ptr, object);
  272. }

  273. ////////////////////////////////////////////////////////////////////////////////
  274. // 带1个参数

  275. template typename ParameterType>
  276. Functor bind(typename FunctionWith1ParameterParameterType>::FunctionPtr function_ptr, ParameterType parameter)
  277. {
  278.     return Functor(function_ptr, parameter);
  279. }

  280. template class ObjectType, typename ParameterType>
  281. Functor bind(typename MemberFunctionWith1ParameterObjectType, ParameterType>::MemberFunctionPtr member_function_ptr, ObjectType* object, ParameterType parameter)
  282. {
  283.     return Functor(member_function_ptr, object, parameter);
  284. }

  285. ////////////////////////////////////////////////////////////////////////////////
  286. // 带2个参数

  287. template typename Parameter1Type, typename Parameter2Type>
  288. Functor bind(typename FunctionWith2ParameterParameter1Type, Parameter2Type>::FunctionPtr function_ptr, Parameter1Type parameter1, Parameter2Type parameter2)
  289. {
  290.     return Functor(function_ptr, parameter1, parameter2);
  291. }

  292. template class ObjectType, typename Parameter1Type, typename Parameter2Type>
  293. Functor bind(typename MemberFunctionWith2ParameterObjectType, Parameter1Type, Parameter2Type>::MemberFunctionPtr member_function_ptr, ObjectType* object, Parameter1Type parameter1, Parameter2Type parameter2)
  294. {
  295.     return Functor(member_function_ptr, object, parameter1, parameter2);
  296. }

  297. ////////////////////////////////////////////////////////////////////////////////
  298. // 带3个参数

  299. template typename Parameter1Type, typename Parameter2Type, typename Parameter3Type>
  300. Functor bind(typename FunctionWith3ParameterParameter1Type, Parameter2Type, Parameter3Type>::FunctionPtr function_ptr, Parameter1Type parameter1, Parameter2Type parameter2, Parameter3Type parameter3)
  301. {
  302.     return Functor(function_ptr, parameter1, parameter2, parameter3);
  303. }

  304. template class ObjectType, typename Parameter1Type, typename Parameter2Type, typename Parameter3Type>
  305. Functor bind(typename MemberFunctionWith3ParameterObjectType, Parameter1Type, Parameter2Type, Parameter3Type>::MemberFunctionPtr member_function_ptr, ObjectType* object, Parameter1Type parameter1, Parameter2Type parameter2, Parameter3Type parameter3)
  306. {
  307.     return Functor(member_function_ptr, object, parameter1, parameter2, parameter3);
  308. }

  309. ////////////////////////////////////////////////////////////////////////////////
  310. static void* thread_proc(void* parameter)
  311. {
  312.     Functor* functor = (Functor*)parameter;
  313.     (*functor)();

  314.     delete functor; // 记得这里需要delete
  315.     return NULL;
  316. }

  317. class CThreadEngine
  318. {
  319. public:
  320.     CThreadEngine(const Functor& functor)
  321.     {
  322.         // bind()返回的是一个临时对象,
  323.         // 故需要new一个,以便在thread_proc()过程中有效
  324.         Functor* new_functor = new Functor(functor);

  325.         int errcode = pthread_create(&_thread, NULL, thread_proc, new_functor);
  326.         if (errcode != 0)
  327.         {
  328.             delete new_functor;
  329.         }
  330.     }
  331.     
  332.     ~CThreadEngine()
  333.     {
  334.         join();
  335.     }
  336.     
  337.     void join()
  338.     {
  339.         if (_thread > 0)
  340.         {
  341.             pthread_join(_thread, NULL);
  342.             _thread = 0;
  343.         }
  344.     }

  345. private:
  346.     CThreadEngine();
  347.     CThreadEngine(const CThreadEngine&);
  348.     CThreadEngine& operator =(const CThreadEngine&);

  349. private:
  350.     pthread_t _thread;
  351. };

  352. ////////////////////////////////////////////////////////////////////////////////
  353. // 以下为测试代码
  354. #if defined(TEST_THREAD_ENGINE)

  355. ////////////////////////////////////////////////////////////////////////////////
  356. // 非类成员函数

  357. static void hello()
  358. {
  359.     printf("[%u] hello\n", pthread_self());
  360. }

  361. static void world()
  362. {
  363.     printf("[%u] world\n", pthread_self());
  364. }

  365. static void hello(int m)
  366. {
  367.     printf("[%u] hello: %d\n", pthread_self(), m);
  368. }

  369. static void world(int m)
  370. {
  371.     printf("[%u] world: %d\n", pthread_self(), m);
  372. }

  373. static void hello(int m, int n)
  374. {
  375.     printf("[%u] hello: %d/%d\n", pthread_self(), m, n);
  376. }

  377. static void world(int m, int n)
  378. {
  379.     printf("[%u] world: %d/%d\n", pthread_self(), m, n);
  380. }

  381. static void hello(int m, int n, int l)
  382. {
  383.     printf("[%u] hello: %d/%d/%d\n", pthread_self(), m, n, l);
  384. }

  385. static void world(int m, int n, int l)
  386. {
  387.     printf("[%u] world: %d/%d/%d\n", pthread_self(), m, n, l);
  388. }

  389. ////////////////////////////////////////////////////////////////////////////////
  390. // 类成员函数

  391. class X
  392. {
  393. public:
  394.     //
  395.     // 不带参数
  396.     //

  397.     void hello()
  398.     {
  399.         printf("[%u] X::hello\n", pthread_self());
  400.     }
  401.     
  402.     void world()
  403.     {
  404.         printf("[%u] X::world\n", pthread_self());
  405.     }
  406.     
  407.     //
  408.     // 带1个参数
  409.     //

  410.     void hello(int m)
  411.     {
  412.         printf("[%u] X::hello: %d\n", pthread_self(), m);
  413.     }
  414.     
  415.     void world(int m)
  416.     {
  417.         printf("[%u] X::world: %d\n", pthread_self(), m);
  418.     }

  419.     //
  420.     // 带2个参数
  421.     //

  422.     void hello(int m, int n)
  423.     {
  424.         printf("[%u] X::hello: %d/%d\n", pthread_self(), m, n);
  425.     }

  426.     void world(int m, int n)
  427.     {
  428.         printf("[%u] X::world: %d/%d\n", pthread_self(), m, n);
  429.     }

  430.     //
  431.     // 带3个参数
  432.     //

  433.     void hello(int m, int n, int l)
  434.     {
  435.         printf("[%u] X::hello: %d/%d/%d\n", pthread_self(), m, n, l);
  436.     }

  437.     void world(int m, int n, int l)
  438.     {
  439.         printf("[%u] X::world: %d/%d/%d\n", pthread_self(), m, n, l);
  440.     }
  441. };

  442. ////////////////////////////////////////////////////////////////////////////////
  443. int main()
  444. {
  445.     // 不带参数
  446.     CThreadEngine engine1(bind(&hello));
  447.     CThreadEngine engine2(bind(&world));
  448.     
  449.     X* x1 = new X;
  450.     X* x2 = new X;
  451.     CThreadEngine engine3(bind(&X::hello, x1));
  452.     CThreadEngine engine4(bind(&X::world, x2));

  453.     // 带1个参数
  454.     CThreadEngine engine5(bind(&hello, 2015));
  455.     CThreadEngine engine6(bind(&world, 2016));
  456.     
  457.     CThreadEngine engine7(bind(&X::hello, x1, 2015));
  458.     CThreadEngine engine8(bind(&X::world, x2, 2016));

  459.     // 带2个参数
  460.     CThreadEngine engine9(bind(&hello, 2015, 5));
  461.     CThreadEngine engine10(bind(&world, 2016, 5));

  462.     CThreadEngine engine11(bind(&X::hello, x1, 2015, 5));
  463.     CThreadEngine engine12(bind(&X::world, x2, 2016, 5));

  464.     // 带3个参数
  465.     CThreadEngine engine13(bind(&hello, 2015, 5, 3));
  466.     CThreadEngine engine14(bind(&world, 2016, 5, 3));

  467.     CThreadEngine engine15(bind(&X::hello, x1, 2015, 5, 3));
  468.     CThreadEngine engine16(bind(&X::world, x2, 2016, 5, 3));

  469.     // 按任意键继续继续
  470.     printf("Press ENTER to exit ...\n");
  471.     getchar();

  472.     engine1.join();
  473.     engine2.join();
  474.     engine3.join();
  475.     engine4.join();
  476.     engine5.join();
  477.     engine6.join();
  478.     engine7.join();
  479.     engine8.join();
  480.     
  481.     engine9.join();
  482.     engine10.join();
  483.     engine11.join();
  484.     engine12.join();
  485.     engine13.join();
  486.     engine14.join();
  487.     engine15.join();
  488.     engine16.join();

  489.     delete x1;
  490.     delete x2;
  491.     
  492.     // 按任意键继续退出
  493.     printf("Press ENTER to exit ...\n");
  494.     getchar();

  495.     return 0;
  496. }

  497. SYS_NAMESPACE_END
  498. #endif // TEST_THREAD_ENGINE
  499. #endif // MOOON_SYS_THREAD_ENGINE_H


相关文章
|
10月前
|
负载均衡 算法 安全
基于Reactor模式的高性能网络库之线程池组件设计篇
EventLoopThreadPool 是 Reactor 模式中实现“一个主线程 + 多个工作线程”的关键组件,用于高效管理多个 EventLoop 并在多核 CPU 上分担高并发 I/O 压力。通过封装 Thread 类和 EventLoopThread,实现线程创建、管理和事件循环的调度,形成线程池结构。每个 EventLoopThread 管理一个子线程与对应的 EventLoop(subloop),主线程(base loop)通过负载均衡算法将任务派发至各 subloop,从而提升系统性能与并发处理能力。
519 3
|
7月前
|
安全 Java 编译器
C++进阶(1)——继承
本文系统讲解C++继承机制,涵盖继承定义、访问限定符、派生类默认成员函数、菱形虚拟继承原理及组合与继承对比,深入剖析其在代码复用与面向对象设计中的应用。
|
11月前
|
机器学习/深度学习 监控 算法
局域网行为监控软件 C# 多线程数据包捕获算法:基于 KMP 模式匹配的内容分析优化方案探索
本文探讨了一种结合KMP算法的多线程数据包捕获与分析方案,用于局域网行为监控。通过C#实现,该系统可高效检测敏感内容、管理URL访问、分析协议及审计日志。实验表明,相较于传统算法,KMP在处理大规模网络流量时效率显著提升。未来可在算法优化、多模式匹配及机器学习等领域进一步研究。
292 0
|
11月前
|
存储 安全 Java
c++--继承
c++作为面向对象的语言三大特点其中之一就是继承,那么继承到底有何奥妙呢?继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用,继承就是类方法的复用。
234 0
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
912 6
|
SQL 数据建模 BI
【YashanDB 知识库】用 yasldr 配置 Bulkload 模式作单线程迁移 300G 的业务数据到分布式数据库,迁移任务频繁出错
问题描述 详细版本:YashanDB Server Enterprise Edition Release 23.2.4.100 x86_64 6db1237 影响范围: 离线数据迁移场景,影响业务数据入库。 外场将部分 NewCIS 的报表业务放到分布式数据库,验证 SQL 性能水平。 操作系统环境配置: 125G 内存 32C CPU 2T 的 HDD 磁盘 问题出现的步骤/操作: 1、部署崖山分布式数据库 1mm 1cn 3dn 单线启动 yasldr 数据迁移任务,设置 32 线程的 bulk load 模式 2、观察 yasldr.log 是否出现如下错
|
C++ 开发者
C++学习之继承
通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。
236 16
|
编译器 C++ 开发者
【C++】继承
C++中的继承是面向对象编程的核心特性之一,允许派生类继承基类的属性和方法,实现代码复用和类的层次结构。继承有三种类型:公有、私有和受保护继承,每种类型决定了派生类如何访问基类成员。此外,继承还涉及构造函数、析构函数、拷贝构造函数和赋值运算符的调用规则,以及解决多继承带来的二义性和数据冗余问题的虚拟继承。在设计类时,应谨慎选择继承和组合,以降低耦合度并提高代码的可维护性。
394 1
【C++】继承
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
476 5

热门文章

最新文章