
c++
iwonako
这个作者很懒,什么都没留下…
展开
-
虚表指针初始化
构造函数中能调用虚函数,也能确定虚表指针的存在。 能否通过下面的结果确定虚表指针在构造函数调用前就初始化好了?欢迎赐教 class A { typedef void(*fp)(); public: virtual void foo() { cout << "virtual void foo()" << endl; } virtual void bar() { cout << "virtual void bar()" << e..原创 2021-12-28 22:20:37 · 659 阅读 · 1 评论 -
继承构造函数
无论子类没无定义自身的默认构造函数,都会调用父类的默认构造。 如果子类没有定义自身的赋值构造函数,会自动调用父类的默认构造函数。若子类定义了,需显式通过初始化列表才能调用父类的赋值构造函数。 如果子类没有定义自身的拷贝构造函数,会自动调用父类的拷贝构造函数。若子类定义了,会自动调用父类的默认构造函数。 轻松的记忆方法是在初始化列表写上想调用的父类构造函数。 class A { public: A() { cout << "A ctor" << endl;.原创 2021-12-02 19:38:58 · 1033 阅读 · 0 评论 -
2021-11-07翻转链表(带头结点)
struct linknode{ int val; linknode* next; } void reverselinklist(linknode* root){ if(nullptr==root)return; linknode* pre=nullptr,cur=root->next; while(cur){ cur->next=pre; pre=cur; cur=pre->next; } .原创 2021-11-07 20:11:10 · 141 阅读 · 0 评论 -
抽象工厂
工厂模式以此只能传递一种工厂(虽说可以改接口),若模块中需要多个对象,则需要传递多个工厂,可以把关联的几个工厂抽象合并为一个工厂。 class Gpu { public: virtual void work() = 0; virtual ~Gpu(){} }; class Gpu_Intel :public Gpu { public: virtual void work() { cout << "Gpu_Intel working" <&l.原创 2021-08-17 15:14:07 · 96 阅读 · 0 评论 -
工厂方法
构造对象一般用new,但是new后面必须是确定的类型,后续需求变了可能要改new这段代码,不稳定。工厂方法是将构造对象的类型交给函数使用者决定,不在函数中构造,而是通过接口传递。但也可以直接传递对象啊,为什么还要引入工厂来构造对象? class Object { public: virtual void foo() = 0; virtual ~Object(){} }; class Object_A:public Object { public: virtual void .原创 2021-08-17 01:51:59 · 93 阅读 · 0 评论 -
桥模式
和装饰器模式类似,不同点在于装饰器模式是用于追加功能的,桥模式是从现有的库中调用方法,库是独立于实现化角色的,因此后者不用继承自前者。核心还是传递指针,然后调用方法。 比如从几个不同平台的库中任意调用及组合方法,参考下例 class Implement { public: virtual void func_1() = 0; virtual void func_2() = 0; ~Implement(){} }; class Implement_1 :public Im.原创 2021-08-17 01:22:02 · 140 阅读 · 0 评论 -
装饰器模式
对模块追加功能,比如追加步骤,几行代码,不影响原有功能时使用此模式。 对现有的n个模块追加m种功能,且功能可以按排列组合使用,直接在原有模块上派生会产生很多子类,而且代码重复。 思路:将追加的功能单独抽象成类(装饰器类),并传入原模块指针,这样就能在实现新功能时调用原模块的方法。除此之外,装饰器类还要继承模块类型,继承了之后能够实现追加 功能的复用,原模块的构造器也能用装饰器类初始化;还能重写方法,不用定义新的方法,调用者不用修改代码;声明对象时也能用统一的形式。 下面以扩展component中的f.原创 2021-08-17 00:41:58 · 81 阅读 · 0 评论