跳至主要内容

c++中类的五种关系

http://ift.tt/2xzTXub

c++中类的五种关系

[TOC]

组合关系

  • 强烈的从属关系
  • 是我本身的一部分
  • 我离开你无法运行,你离开我也不能运行

具体使用的方法就是用做类的数据成员

    class A{
        private:
            ...
        public:
            ...
    };
    class B {
        private:
            B objB;

            };

举个坦克大战的例子就是操作引擎和地图就应该是组合关系
操作引擎的操作依赖于地图,没有地图,操作引擎无法绘制,地图离开操作引擎,也没有办法显示

继承关系

继承是组合的一种特殊形式

聚合关系

  • 按照讲义上来说是部件可共享
  • 但是我感觉这个讲义上讲的有点问题

我自己的理解:

首先看语法:

   class A{
    public:
        B b;
        };

    class B{
            };

聚合和组合其实应该是差不多的,从使用语法上完全无法分辨

B类于A类是组合或者聚合的前提是:

  • B类必须是确定存在的
  • 销毁A类,B成员也随之消失
  • 销毁B成员,A类也不存在

关联关系

  • 我不依赖你,没有从属关系
  • 有你也行, 没你也行,整个程序不影响运行
  • 但是如果有你的时候需要和你互动
    class A{
    };

    class B{
        public:
            A *a;
    };

  • B 类中,A类不一定是具体存在的
  • 销毁B类,A类可能还存在

依赖关系

  • 没有从属关系
  • 有你也行,没有也中
  • 不需要跟你保持持久的交流
  • 就是偶尔在需要的时候用一下你
  • 表现在语法中就是把你这类的实例对象作为参数传递进去
    class A{
    };

    class B {
        public:
            void fun(A);
    };

最后

总结语法:
    组合和聚合可以是一种语法,都是作为另一个类的数据成员,作为这个类的不可获取的一部分,从一开始就保持持久的交流和数据交换

  依赖和关系可以是一种语法:都是作为另一个类的指针成员,没有强烈的从属关系,在需要用到的时候使用,且仅在使用的时候有数据交流

The post c++中类的五种关系 appeared first on cole.

http://ift.tt/eA8V8J c++, class, cpp, 面向对象 September 25, 2017 at 06:05PM

评论

此博客中的热门博文

反Hook 之自己实现GetProcAddress和LoadLibraryA(c++ version)

http://ift.tt/2AocAD0 // 课上练习.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <windows.h> //要实现的功能: /* 自己实现GerProcAddress LoadLibraryA */ //思路: /* GerProcAddress和LoadLibraryA都是在Kernel32.dll中的 首要的任务就是找到Kernel32.dll,然后遍历IAT就能找到这两个函数 现在首要的难点就是如何找到kernel32.dll() 通过dll的加载顺序可以找到,而且虽然需要使用未文档化的API,但是好在windgb可以直接看,而且用到的也并不是很多 懒得去晚上搜了,直接自己实现一个得了,作为演示,能用就行(最好还是搜一个正规的结构体) */ /* 0: kd> dt _TEB /a nt!_TEB +0x000 NtTib : _NT_TIB +0x01c EnvironmentPointer : Ptr32 Void +0x020 ClientId : _CLIENT_ID +0x028 ActiveRpcHandle : Ptr32 Void +0x02c ThreadLocalStoragePointer : Ptr32 Void +0x030 ProcessEnvironmentBlock : Ptr32 _PEB //首先实现部分TEB结构体,因为只需要用的PEB的部分,所以实现到这就ok了 */ //构建 TEB typedef struct _TEB { //保证0x30是peb的结构体就ok了 struct _tem { DWORD a1; DWORD a2; DWORD a3; DWORD a4; DWORD a5; DWORD a6; DWORD a7; DWORD a8; DWORD a9; DWORD a10; ...

IDA动态调试ELF中遇到的问题(1)

https://ift.tt/2Gxnf2F 遇到 got SIGCHLD singal(child status has changed)...这种提示 singal fork了子进程 直接点yes,然后继续单步执行,出来提示 pass to application就行了 内存查看 用od习惯了之后,凡事都想右键看一下内存,但是IDA中好像没有那么如意, 目前只是在栈中右键发现有查看hex的选项 动态调试的时候的nop ida保存动态调试的时候修改的数据 方法一:在程序运行的时候保存 The post IDA动态调试ELF中遇到的问题(1) appeared first on cole . https://ift.tt/2q9Qf5g WHATEVER April 05, 2018 at 09:44AM

手工加壳Demo- C++Version

http://ift.tt/2AAEutK // 手动加壳demo.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <windows.h> #include <string.h> typedef struct _StubConf { IMAGE_NT_HEADERS ntheader; }STUBCONF; class PeFile { public: PeFile(); ~PeFile(); bool OpenFile(const char*FilePath); bool InitHdrs(); PIMAGE_SECTION_HEADER addSection(const char * secName, DWORD dwSecSzie); PIMAGE_SECTION_HEADER getSection(const char* secName); DWORD Size2ALi(DWORD dwSize, DWORD dwALi); void peclose(); void setOpe(DWORD newOep); LPVOID peGetProcAddress(const char* szFnName); DWORD RVATOOFFSET(DWORD rva); ULONG_PTR getfileBuff(); PIMAGE_NT_HEADERS getNtHeader(); PIMAGE_OPTIONAL_HEADER getOptionHeader(); void fixStubReloc(DWORD oldImageBase, DWORD newImageBase, DWORD oldSectionRva, DWORD newSectionRva); void setSecData(IMAGE_SECTION_HEADER* pScn, void* pSectionData, DWORD dwSectionSize); bool savea...