1.使用Non-Virtual Interface 实现方法模版 将虚方法声明为private,子类重写private的虚方法,在父类中通过public方法调用虚方法.NVI的优点是:可以在虚方法之前和之后做一些事情. 2.使用方法指针实现策略模式 在类中关联一个方法指针,方法指针的形参是类对象的引用.实例化一个对象的时候,把一个方法传递给对象,这就意味着每个对象都有一个方法.这种方式提供了一些有趣的弹性:a.同一类型的不同对象可以有不同的计算方法:b.在运行期可以更改对象的计算方法.这种方式的…
http://blog.csdn.net/ckli/article/details/2201418 override 重写 也叫覆盖 .方法的重写Overriding和重载Overloading是Java多态性的不同表现.重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现. 如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding). 子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定…
1.绝不在构造和析构过程中调用virtual方法,为啥? 原因很简单,对于前者,这种情况下,子类专有成分还没有构造,对于后者,子类专有成分已经销毁,因此调用的并不是子类重写的方法,这不是程序员所期望的. 2.在构造方法和析构方法中,直接调用virtual方法,很容易识别.还有一种情况要注意,那就是间接调用.比如:构造方法调用init方法,而init方法调用virtual方法. 3.在构造过程中,不能使用virtual从上到下调用,哪有什么办法弥补呢? 可以将子类必要的信息向上传递给父类构造方法.…
1.使用场景 virtual方法的使用场景:父类告诉子类,继承接口,修改实现,从而可以面向接口编程. non-virtual方法的使用场景:父类告诉子类,继承接口和实现,从而可以代码复用. 2.成员方法是一种封装技术,暴露给程序员.对于编译器而言,没有成员方法的概念,编译器会把成员方法编译为普通方法,方法的拥有者(也就是对象)转化为普通方法的形参,这个形参是const指针,名称为this,指向的类型是方法拥有者的类型. 3.编译器编译的时候,只知道指针的表面类型,正是这个表面类型引导编译器去解释…
virtual 关键字用于修饰方法.属性.索引器或事件声明,并使它们可以在派生类中被重写.默认情况下,类中的方法是非虚的,非虚的方法不能在子类中被覆盖(override),但是可以隐藏(new),但这不影响父类方法的功能.为了达到子类以自己的方法实现某一功能的目的,需要在父类中用virtual关键字来修饰方法,这样,在其继承子类中就可以采用覆盖的方法来提供方法的多态机制.virtual关键字在类中修饰方法需要注意以下几点: 1. virtual修饰类中方法时,前面必须有public修饰符,非虚方…
Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项) A.cat B.concat C.join D.+ 解答:B…
游戏中的人物伤害值计算问题. (一)方法(1):一般来讲能够使用虚函数的方法: class GameCharacter { public: virtual int healthValue() const; //返回人物的体力值,派生类能够做出改动 ... }; 这确实是一个显而易见的设计选择.但由于这种设计过于显而易见,可能不会对其他可选方法给予足够的关注.我们来考虑一些处理这个问题的其他方法. (二)方法(2):使用NVI方法,在基类中使用一个公有的普通函数调用私有的虚函数. class Ga…
virtual函数的替代方案包括NVI手法及Strategy设计模式的多种手法.NVI手法自身是一个特殊形式的Template Method设计模式. 将机能从成员函数移到class外部函数,带来的一个缺点是,非成员函数无法访问class的non-public成员. tr1::function对象的行为就想一般函数指针.这样的对象可接纳“与给定之目标签名式(target signature)兼容”的所有可调用物(callable entities).…
有一部分人总是主张virtual函数几乎总应该是private:例如下面这个例子,例子时候游戏,游戏里面的任务都拥有健康值这一属性: class GameCharacter{ public: int healthValue()const{ ... int retVal = doHealthValue(); ... return retVal; } private: virtual int doHealthValue() const { }//上面的这个non-virtual函数实际上是virtu…
NOTE: 1.virtual 函数的替代方案包括NVI手法及Strategy设计模式的多种形式.NVI手法自身是一个特殊形式的Template Method设计模式. 2.将机能从成员函数移到外部函数,带来的一个缺点是,非成员函数无法访问class的non-public成员. 3.tr1::function 对象的行为就像一般函数指针.这样的对象可接纳“与给定之目标签名式(target signature)兼容”的所有可调用物(callable entiies). 不懂这条,设计模式不懂!!!…
举书上的例子,考虑一个virtual函数的应用实例: class GameCharacter { private: int BaseHealth; public: virtual int GetHealthValue() const // 返回游戏人物的血量 { return BaseHealth; } int GetBaseHealth() const { return BaseHealth; } }; class KnightBoss : public GameCharacter { pub…
美·Scott Meyers 侯捷 More Exceptional C++: 40 New Engineering Puzzles, Programming Problems, and Solutions 红黑树: 从根到每个叶子节点的路径 都包含相同数目的黑链 从根到每个叶子节点的路径 不能包含两个或更多的连续红链 红黑树是引来表示2-3-4树的 每个节点最多保存3个数据 每个非叶结点要么是2节点,要么是3节点,要么是4节点 所有叶子同一层 2-3-4树 BST树 红黑树 都是内部查找树 B…
Spinner是一个列表选择框.相当于弹出一个菜单供用户进行选择. Spinner继承AdapterView Spinnet支持的XML的属性: android:entries:使用数组资源设置该下拉列表框的列表项目 android:popupBackground:设置下拉列表框的背景色 (一般这两个比較经常使用一点) 用Spinner用两种方法: 第一.已经确定下拉列表里的列表项,仅仅要为Spinner指定android:entries属性就能够实现Spinner. 第二.假设程序须要在执行时…
​  前言  本文介绍一篇CVPR2020的论文,它在paperswithcode上获得了16887星,谷歌学术上有261的引用次数. 论文主要介绍了目标检测现有的研究进展.anchor-based和anchor-free的背景和各自的方法差异,并提出了一种新的正负样本选择方案,用于消除这两者之间的差距. 注:论文讲述了很多关于anchor方面的知识,这篇文章保留了较多原论文中的内容,在介绍新方法的同时,可作为深入理解anchor的文章. 论文:Bridging the Gap Between…
详情见<Effective C++>item35 1.使用non-virtual interface(NVI)手法,这是Template Method设计模式的一种特殊形式. 它以public non-virtual成员函数包裹较低访问性(private 或 protected)的virtual函数. 2.strategy设计模式 a.将virtual 函数替换为“函数指针成员变量” b.以tr1::function成员变量替换virtual函数,因而允许使用任何可调用物搭配一个兼容于需求的签…
cocos2dx 3.0版本号TableView拍生自ScrollView,经常使用来做滚动列表,有几种特殊使用方法,不知道大家用到过没 要求:1.滚动时不能选中TableCell,非滚动状态才干选中 非常easy,在TableView的delegate函数中,通过isTouchMoved()函数来推断 void WeaponSelectLayer::tableCellUnhighlight(cocos2d::extension::TableView* table, cocos2d::exten…
本质上是说了:   Template Pattern & Strategy Pattern 详细见<C++设计模式 23种设计模式.pdf 55页> 宁可要组合 不要继承. —————————————————————————————————————————— 要先看懂策略模式…
条款35 考虑virtual函数以外的其他选择 记住: ★virtual函数的替代方案包括NVI手法及Strategy模式的多种形式.NVI手法自身是一个特殊形式的Template Method模式 ★将机能从成员函数移到class外部函数,带来的一个缺点是,非成员函数无法访问class的non-public成员 ★tr1::function对象的行为就像一般函数指针.这样的对象可接纳“与给定之目标签名式兼容”的所有可调用物 -----------------------------------…
32.确保你的public继承了模is-a关系 public继承意味着is-a关系(里氏替换原则),一切适用于基类也适用于派生类. 矩形继承正方形问题: 可实施与矩形的操作无法实施与正方形 在编程领域.正方形是一种矩形是错误的 在现实领域,正方形是一种矩形是正确的 33.避免遮盖继承而来的名称 class Base { private: int x; public: virtual void mf1() = 0; virtual void mf1(int); virtual void mf2()…
我根据自己的理解,对原文的精华部分进行了提炼,并在一些难以理解的地方加上了自己的"可能比较准确"的「翻译」. Chapter 6 继承与面向对象设计 Inheritance and Object-Oriented Design 条款32: 确定你的public继承塑模出is-a关系 以C++进行面向对象编程,最重要的一个规则是:public inheritance(公开继承)意味着"is-a"(是一种)的关系.请牢记这个规则! 如果你令class D(Derived…
1. 让自己习惯C++ 条款01: 视C++为一个语言联邦 1.1 C++ 是一个多重泛型编程语言(multiparadigm programming),支持:过程形式(procedural),面向对象形式(object-oriented),函数形式(functional),泛型式(generic),元编程(metaprogramming). 1.2 将C++看做主语言,那么他就四种次语言组成:C,object-oriented C++,Template C++, STL. 请记住: C++ 高…
看完Effective C++才觉得平时程序设计时需要注意的一些问题,有一定的收获,不过因为没什么项目实践, 并未很深入了解具体情况如何,还需后继实践~ 列举一下55个条款: 1. 视C++为一个语言联邦. 2. 尽量以const, enum ,inline 替换#define a)  对于单纯常量,最好以const 对象或 enum 替换 #define b)  对于形似函数的宏,最好改用inline 函数替换 #define 3. 尽可能使用const a)  将某些东西声明为const可帮…
Charpter 1. 让自己习惯C++   条款01: 视C++为一个语言联邦 条款02: 尽量以const,enum,inline替换#define 条款03: 尽可能使用const 条款04: 确定对象被使用前已先被初始化 Charpter 2. 构造/析构/赋值运算                           条款05: 了解C++默默编写并调用哪些函数 条款06: 若不想使用编译器自动生成的函数,就该明确拒绝 条款07: 为多态基类声明virtual析构函数 条款08: 别让异…
1. 让自己习惯C++(Accustoming yourself to C++) 条款01: 视C++ 为一个语言联邦(View C++ as a federation of languages) 条款02: 尽量以const,enum,inline替换#define(Prefer consts,enums,and inlines to #define) 条款03: 尽可能使用const(Use const whenever possible) 条款04: 确定对象被使用前已先被初始化(Make…
Effective C++ Iter 3 - 尽可能使用 const 一个反逻辑的 bitwise const class Text { ... char& operator[](std::size_t pos) const { return text[pos]; } private: char *text; }; . 在 clang 3.8 上编译失败,编译器已经修复这个反逻辑的问题.const 成员函数只能返回 const char& 类型的变量,这就保证了对象不能被修改. 当存在 c…
1.代理模式 2.模版 3.NVI(non-virtual interface) 参考:https://www.cnblogs.com/qicosmos/p/4772389.html <effective C++>条款35:考虑virtual函数以外的其他选择…
在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Virtual方法(虚方法) virtual 关键字用于在基类中修饰方法.virtual的使用会有两种情况: 情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法.那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法. 情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法.那么在对派生…
1.考虑下面的需要,需要一个工厂方法.工厂方法的规则是:在堆上分配一个子类对象,并返回父类指针.使用完毕,delete父类指针.如果父类的析构方法不是virtual,将直接调用父类的析构方法,导致局部销毁的对象,父类成分销毁了,子类成分没有销毁. 2.如果类中有virtual方法,意味着面向抽象编程,也就是会有父类指针指向子类对象,因此这种情况下,必定需要一个virtual析构方法. 3.如果类中没有virtual方法,为了节省空间,析构方法是non-virtual方法.也就意味着,这个类不作为…
Virtual方法(虚方法) virtual 关键字用于在基类中修饰方法.virtual的使用会有两种情况: 情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法.那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法. 情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法.那么在对派生类实例的调用中,该虚方法使用的是派生重写的方法. 代码如下: namespace VirtualTestApplication{ public class…
1. 选择元素的基本方法 对于百度搜索页面,如果我们想自动化输入爱编程的小灰灰,怎么做呢? 这就是在网页中,操控界面元素. web界面自动化,要操控元素,首先需要选择界面元素 ,或者说定位界面元素 就是先告诉浏览器,你要操作哪个界面元素, 让它找到你要操作的界面元素. 我们必须要让浏览器先找到元素,然后才能操作元素. 1.1 查看元素的方法 对应web自动化来说,就是要告诉浏览器,你要操作的界面元素是什么. 那么,怎么告诉浏览器呢? 方法就是:告诉浏览器,你要操作的这个web元素的特征. 就是告…