首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++核心准则​讨论:将函数设为公共和虚拟,或保护和非虚拟

这种情况导致较早编码标准对所有函数都必须是虚拟提出了全面的要求。这太过分了(即使是常见情况);相反,规则应该是当且仅当函数是公共时,才将它们虚函数。...可以看作只是另一种操作,尽管具有使非虚调用变得危险或错误特殊语义。因此,对于函数,选择是根据是否允许通过指向Base指针实际上调用它。“非虚”不是一种选择。...B是可以自己实例和具体,因此函数必须是公共,才能创建和销毁B对象。...但是,通常应避免使用具体(请参阅第35项)。例如,unary_function是typedef捆绑包,不能独立实例。给它一个公开函数确实没有任何意义。...更好设计是遵循该产品建议,为其提供保护非虚函数

1.1K20

C++核心准则C.35:函数要么是公开函数,要么是保护非虚函数

C.35: A base class destructor should be either public and virtual, or protected and nonvirtual 函数要么是公开函数...为了避免无定义行为。如果函数是公有的,那么调用侧代码就会尝试使用指针销毁派生对象,在函数为非虚函数时其结果时没有定义。...如果函数保护,那么调用侧代码就无法通过类型指针销毁派生对象,这是函数就没有必要一定是虚函数函数保护而不是私有的,这样派生函数才能调用它。...通常,设计者不会知道在函数中应该执行什么样动作。...我们可以想象一种需要保护函数函数情况:当希望允许派生对象(只有这个类型通过指针销毁另外一个对象(不是它自己)时。但是我们还没有在实际开发中遇到这种情况。

1K20
您找到你想要的搜索结果了吗?
是的
没有找到

C++面试知识总结

2.6 new/delete和malloc/free区别 new/delete用调用构造函数实例对象和调用函数释放对象申请资源。...3.5 和子类构造、顺序 定义一个对象时先调用构造函数、然后调用派生构造函数 先派生,也就是说在调用时候,派生信息已经全部销毁了 3.6 深拷贝与浅拷贝区别...  3.8 函数特点 函数名称固定:~名( ) 没有返回类型,没有参数 不可以重载,一般由系统自动调用 3.8 公有继承、私有继承、保护继承 公有继承时,派生对象可以访问公有成员...,派生成员函数可以访问公有和保护成员;公有继承时保护成员,可以通过派生对象访问但不能修改。...私有继承时,成员只能被直接派生成员访问,无法再往下继承。 保护继承时,成员也只被直接派生成员访问,无法再往下继承。

1.7K41

php面试中关于面向对象相关问题

多态包括参数多态和包含多态。多态性语言具有灵活、抽象、行为共享、代码共享优势,很好地解决了应用程序函数同名问题。 三、什么是构造函数函数?...默认情况下,系统仅释放对象属性所占用内存,并不销毁在对象内部申请资源(例如,打开文件、创建数据库连接等),而利用函数在使用一个对象之后执行代码来清除这些在对象内部申请资源(关闭文件、断开与数据库连接...与构造函数类似,如果想在子类中调用函数,那么需要显式地调用:parent::__destruct()。如果子类没有定义函数,那么它会继承函数。...2)protected(保护类型)表示保护,只有本类或子类可以访问。...在实例对象中,不能通过$obj- var来访问protected类型方法或属性。 3)private(私有类型)表示私有的,只有本类内部可以使用。

1.7K20

【C++】继承 ⑥ ( 继承中构造函数函数 | 类型兼容性原则 | 指针 指向 子类对象 | 使用 子类对象 为 对象 进行初始 )

一、public 公有继承 - 示例分析 1、类型兼容性原则 类型兼容性原则 : C++ " 类型兼容性原则 “ 又称为 ” 赋值兼容性原则 " ; 子类代替父 : 需要 ( ) 对象...地方 , 都可以使用 " 公有继承 " 派生 ( 子类 ) 对象 替代 , 该 派生 ( 子类 ) 得到了 除 构造函数函数 之外 所有 成员变量 和 成员方法 ; 功能完整性 :..." 公有继承 " 派生 ( 子类 ) 本质上 具有 ( ) 完整功能 , 使用 可以解决问题 , 使用 公有继承派生 都能解决 ; 特别注意 : " 保护继承 " 和..." 私有继承 " 派生 , 是 不具有 完整功能 , 因为 最终继承 后派生 , 无法在 外部调用 公有成员 和 保护成员 ; 2、类型兼容性原则应用场景 " 类型兼容性原则...子类对象 , 指针 值为 子类对象 在 堆内存 地址 , 也就是 将 子类对象 地址 赋值给 类型指针 ; 引用 : 引用 引用 子类对象 , 将 子类对象 赋值给 类型引用 ; 二

21920

硬核 | C++ 基础大全

通过继承创建称为“子类”或者“派生”,被继承称为“”、“”或“超”。继承过程,就是从一般到特殊过程。要实现继承,可以通过“继承”和“组合”来实现。...动态多态实现与虚函数表,虚函数指针相关。 扩展: 子类是否要重写函数?子类继承时, 纯虚函数必须重写,否则子类也是一个虚不可实例。...举例来说就是,一个指针指向一个派生对象,在使用完毕准备销毁时,如果函数没有定义成虚函数,那 么编译器根据指针类型就会认为当前对象类型,调用函数 (该对象函数函数地址早就被绑定为函数...如果函数定义成虚函数,那么编译器就可以根据实际对象,执行派生函数,再执行函数,成功释放内存。...特别是,需要知道要创建对象的确切类型,因此,构造函数不应该被定义成虚函数; 而且从目前编译器实现虚函数进行多态方式来看,虚函数调用是通过实例之后对象函数表指针来找到虚函数地址进行调用,如果说构造函数是虚

1.2K10

PHP学习记录之面向对象(Object-oriented programming,OOP)基础【、对象、继承等】

在定义和实现一个时候,可以在一个已经存在基础之上来进行,把这个已经存在所定义内容作为自己内容,并加入若干新内容。 − 一个被其他继承,可将该类称为,或,或超。...函数往往用来做”清理善后” 工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在函数中用delete释放)。...函数定义类似 PHP 函数定义,但函数只能通过该类及其实例对象访问。 来看下实例: <?...当创建后,我们可以使用 new 运算符来实例该类对象,如下: $luyaran = new Site; $cuijinpeng = new Site; 通过以上代码,我们已经创建了两个对象,并且两个对象各自都是独立...protected(保护):保护成员则可以被其自身以及其子类和访问。 private(私有):私有的成员则只能被其定义所在访问。

1.4K41

继承

,想访问被隐藏成员,可以借助作用域限定符“::” 子类对象任何时候都可以被当成类型对象(皆然性 ISA) 保护继承特点 使公有成员和保护成员进行保护,只禁止外部通过该子类访问 子类指针或引用不能隐式转换成类型指针或引用...私有继承特点 将公有和保护成员私有,禁止外部通过该子类访问,也禁止该子类子类访问 子类指针或引用不能隐式转换成类型指针或引用 访问控制权限 访问控制限定符 访问控制属性 子类 外部...() { //son s; 无法实例对象 } 构造顺序 子类构造 子类构造函数会调用构造函数,构造子类对象中子对象 子类构造函数没有显示指明基构造方式,会选择缺省构造函数...构造过程:构造子对象-》构造成员变量-》执行构造代码 子类 子类会调用 通过指针子类对象,只会子类对象中子对象。...可能造成内存泄漏 过程:执行代码-》构成员变量-》子对象 演示 #include #include using namespace std; class

67220

C++中继承

,但是结果中却出现了Person中构造函数函数。..._num; } } ⭐4.派生函数会在被调用完成后自动调用函数清理成员。因为这样才能 保证派生对象先清理派生成员再清理成员顺序。...派生函数对于上面三种函数来说,它有点怪,它不需要在显示调用函数函数会在派生函数调用完后跟着调用起来!...如果非要去显示调用的话,可能会出现对同一空间了两次情况。因为在派生函数了一次,然后到时候,函数又调用了一次,这样就会报错!...派生对象清理先调用派生再调。 继承与友元 一句话:友元关系不能继承,也就是说友元不能访问子类私有和保护成员。

93230

C++之面向对象语法笔记

拷贝构造函数通常用于: 通过使用另一个同类型对象来初始创建对象。 复制对象把它作为参数传递给函数。 复制对象,并从函数返回这个对象。 对拷贝,C++ String源码,最能体现。...先调用构造函数 //2.释放时先调用子类函数 //子类没有 就使用方法 //子类有实现,就是用子类重写 //类型引用 赋值子类型对象 方法都是类型方法 void funExtends...当使用不同类型继承时,遵循以下几个规则: 继承类型 说明 public 当一个派生自公有时,公有成员也是派生公有成员,保护成员也是派生保护成员,私有成员不能直接被派生访问...,但是可以通过调用公有和保护成员来访问。...纯虚函数(抽象) 当一个具有一个纯虚函数,这个就是抽象 抽象不能实例对象 子类继承抽象,必须要实现纯虚函数,如果没有,子类也是抽象 关于虚函数和纯虚函数具体:https://www.runoob.com

1.5K40

C++ 知识点总结篇

,但不能有返回类型; 构造函数作用:为对象分配空间、为数据成员赋初值、请求其他资源; 构造函数工作:初始函数表、建立对象、建立非静态数据成员对象、安置虚对象信息、执行构造函数体中代码; 若一个中没有定义构造函数...,编译器会自动生成不带参数默认构造函数,格式为: ::() { } 函数 函数作用:清除对象、释放内存函数工作:执行函数代码、将对象占据存储空间归还系统...、做公共及用户要求善后工作; 函数无参数和返回值,一个中只能定义一个函数,故不能重载,格式为: ~(); 内存布局 全局数据区:存放全局变量、静态数据、常量; 代码区:存放成员函数...:公有成员和保护成员作为子类私有成员,且不能被子类派生访问; 公有继承 public:公有成员和保护成员作为子类成员时,仍保持原有状态,私有成员仍为私有; 保护继承 protected...:公有成员和保护成员成为子类保护成员,且只能被他派生成员函数或友元访问,私有成员仍为私有; 派生构造函数调用顺序: 调用构造函数,调用顺序按继承时说明顺序; 调用子对象构造函数

39630

【C++】继承

派生对象初始化时,先调用构造再调用子类构造,在时与栈结构相同,先调用子类函数,在子类函数调用完毕时,编译器会自动调用函数。...额外多说一点是,如果我们自己调用函数的话,则必须指明域,因为编译器会把函数名特殊处理成destructor(),所以如果不指定域就会出现派生函数内部调用自己函数,则编译器会报错...最后归纳一下,将派生分为三部分,内置类型,自定义类型成员,成员统一调用成员函数进行处理,除不需要显式调用外,其他都需要显示调用。...对于内置类型则构造不处理,赋值和拷贝进行浅拷贝。 自定义类型成员会被自定义类型对应默认成员函数来处理。...可得结论:子类函数不需要显示调用,依靠编译器之后自动调用即可。

64210

后台开发:核心技术与应用实践 -- C++

):公用成员和保护成员在派生中成了私有成员,其私有成员仍为私有 保护继承(protected inheritance):公用成员和保护成员在派生中成了保护成员,其私有成员仍为私有...在派生时,派生是不能继承函数,也需要通过派生函数去调用函数。...在派生中可以根据需要定义自己函数,用来对派生中所增加成员进行清理工作;清理工作仍然由函数负责。...在执行派生函数时,系统会自动调用函数和子对象函数,对和子对象进行清理。...单例模式 通过本身来管理其唯一实例,唯一实例一个普通对象,但设计这个时,让它只能创建一个实例并提供对此实例全局访问。

1.3K10

派生多态虚函数

根据引用或指针所绑定对象类型不同,该调用可能执行版本,也可能执行某个派生版木,通过在其成员函数声明语句之前加上关键字virtual使得该函数执行动态绑定。...我们用保护(protected)访问运算符说明这样成员。 派生必须通过使用派生列表(clss erivatin list)明确指出它是从哪个(哪些)继承而来。...1.虚与纯虚共性: 解决指针释放子类对象不干净问题 都需要有具体函数实现 2.区别: 如果是纯虚,该类属于抽象,无法实例 .虚语法: virtual ~名(){}...func() = 0; 抽象无法实例对象(堆区,栈区) 子类也必须要重写函数,否则子类也就是抽象 具体代码示意如下所示 #include using namespace...void func() = 0; /* 抽象无法实例对象(堆区,栈区) 子类也必须要重写函数,否则子类也就是抽象 */ virtual ~base()

14620

【c++】继承学习(二):探索 C++ 中派生默认机制与静态成员共享

,对内置类型不做处理,对自定义类型调用它默认构造函数,规则和以前一样 派生里面,把成员当做一个整体 派生构造函数必须调用构造函数初始那一部分成员。...上面的修改确保当创建Student 对象时,它会首先调用 Person 构造函数初始 _name,然后初始派生 Student _num 成员 派生这里分成了两个部分:和自己...这样设计可以防止成员被重复释放或者提前释放,从而导致潜在错误和资源泄漏 派生对象初始:先调用构造再调派生构造 派生对象清理:先调用派生再调。...那么编译器会对函数名进行特殊处理,处理成destrutor(),所以函数不加virtual情况下,子类函数函数构成隐藏关系 所以我们想显示调用就需要这样写: ~Student...() { Person::~Person(); cout << "~Student()" << endl; } 但是这里会导致一个问题,多调用了一次,就是因为函数先调用子类再调用,子类函数结束后会自动调用

9610

PHP.步步为营 | 与面向对象 知识详 与 运用实例

和对象 关于知识我们可以类比Java语法去记忆, 对象通过new关键字进行实例实例对象通过-> 调用成员; demo: <?...构造函数函数 PHP5可以在中使用__construct()定义一个构造函数具有构造函数,会在每次对象创建时候调用该函数,因此常用来在对象创建时候进行一些初始化工作。...函数被调用 demo2: <?...} } // $car = new Truck(); $car1 = new Audi(); 运行结果: 构造函数被调用 子类构造函数被调用 函数被调用 子类函数被调用 由上述代码...(); //通过静态方法来获得一个实例 demo: 设计一个中公有方法,其中调用被保护方法; 被保护方法操作了中私有变量; 实例对象,调用公有方法,间接对中私有变量进行操作: <?

99950

《C++Primer》第十五章 面向对象程序设计

首先初始部分,然后按照声明顺序依次初始派生成员。 2.2 派生使用成员 派生可以直接访问公有成员和保护成员。...派生成员或者友元只能通过派生对象来访问保护成员,派生对于一个对象中保护成员没有任何访问特权 理解最后一条规则可以参考如下例子: class Base { protected:...clobber(Base &b) { b.port_mem = 0; } 派生成员和友元函数只能访问派生对象中部分保护成员,对于普通对象中成员不具有特殊访问权限。...我们通过中将函数定义为虚函数以确保执行正确函数版本。...因此如果构造函数或者函数调用了某个虚函数,则我们应该执行与构造函数或者函数所属类型相对应函数版本。 8. 继承构造函数 一个只初始直接,一个也只继承其直接构造函数

1.2K20

中承上启下角色——继承

---- 前言 承上:在面向对象编程时,我们通常将我们需求实例相关对象,在碰到需要处理大量相同对象或相似的操作时,我们引入了函数和模板等标准功能,虽然我们可以通过模板等手段来提高上述功能编写时泛型...派生函数会在被调用完成后自动调用函数清理成员。因为这样才能 保证派生对象先清理派生成员再清理成员顺序。 5. 派生对象初始先调用构造再调派生构造。...派生对象清理先调用派生再调。 7. 因为后续一些场景函数需要构成重写(多态中一种父子成员函数关系),重写条件之一是函数名相同(重写条件之一为隐藏条件)。...那么编译器会对函数名进行特殊处理,处理成destrutor(),所以函数不加virtual(多态与继承一个重要关键字)情况下,子类函数函数构成隐藏关系。  ...无论派生出多少个子 ,都只有一个static成员实例 。 理解:静态成员与普通成员存在位置不一样,前者为静态区,后者在栈中,静态区中变量创建多少个实例,静态成员变量都会共享同一内存空间。

72430

从零开始学C++之继承(一):公有私有保护继承、overloadoverwriteoverride之间区别

称为派生或子类,原有称为 派生具体 (一)、派生声明语法为: class 派生名 : 继承方式  名 {            派生新增成员声明;...首先想到是在C++ 中,子类构造函数会自动调用构造函数。同样,子类函数也会自动调用函数。要想一个不能被继承,我们只要把它构造函数函数都定义为私有函数。...那么当一个试图从它那继承时候,必然会由于试图调用构造函数函数而导致编译错误。 可是这个构造函数函数都是私有函数了,我们怎样才能得到该类实例呢?...这难不倒我们,我们可以通过定义静态来创建和释放实例。...但当我们试图从FinalClass2继承一个创建实例时,却不同通过编译。

92000

C++基础知识精髓

在C++中,结构可作为一种特殊,它虽然可以包含函数,但是它没有私有或保护成员。 C++中包含私有、公有和保护成员,C++中可定义三种不同访控制权限成员。...构造函数函数 构造函数 1.特殊成员函数,名字跟名相同,没有返回类型,必须为public,构造函数作用是初始对象属性。...5.什么时候一定要用初始列表 有const成员变量和引用成员变量时候一定要用初始列表初始这两种变量 函数 没有返回值,函数名称类型前加~ 1.如果是栈对象 作用域结束时候自动调用函数...继承 继承:之间关系 () 子类(派生) 继承语法 构建子类对象,先调用构造函数,再调用子类自己构造函数时候先调用子类自己函数,再调用函数 ...在函数形参表后面写上= 0以指定纯虚函数,含有纯虚函数对象(抽象)不能被实例,只能作为被继承。

2K50
领券