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

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

,或保护和非虚拟 Should destruction behave virtually?...否则,应该对其进行保护,以便只有派生才能在自己析构函数中调用它,这个析构函数也应该是非虚,因为它不需要虚拟地运行。...如第39项所述,对于普通成员函数,选择之间是允许以非虚拟方式(通过指向Base指针)调用它(但如果它调用虚拟函数(例如在NVI或模板方法模式中),则可能具有虚拟行为) ),实际上还是根本没有。...然后,即使析构函数必须是公共,也可能会面临很大,不将其虚函数化压力,因为作为第一个虚拟函数,当永远不需要添加功能时,它将招致所有运行时类型开销。...更好设计是遵循该产品建议,为其提供保护非虚析构函数。

1.1K20

【C++篇】C++与对象深度解析(五):机制、内部类与匿名对象高级应用

可以是函数或,而这种关系是在定义中通过关键字 friend 显式声明。 4.1 基本概念 函数:函数可以访问私有和保护成员,但它并不是成员函数。...:某个所有成员函数都可以是另一个,允许访问该类私有和保护成员。...虽然 func 是一个独立于外部函数,但通过声明,它获得了访问私有数据权限。 4.3 允许一个所有成员函数访问另一个私有和保护成员。...成员函数并不需要逐一声明为,只要被声明为,所有的成员函数都能访问另一个私有和保护成员。...5.5 内部类关系 内部类默认是外部类,这意味着内部类可以访问外部类私有和保护成员。

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

    【C++】 ( 简介 | 声明 | 单向性 | 继承性 | 作用 | 函数由来 | Java 反射机制 | C C++ 编译过程 )

    保护成员 ; B 是 A 好朋友 , B 可以访问 A 所有成员 ; 2、声明 声明一个 B 是 另一个 A , 可以 在 A 中使用 friend 关键字来声明 ;...B 是 A ; B 中定义 A 类型成员变量 ; B 可以访问 A 中 所有成员 , 包括 私有成员 或 保护成员 ; B 可以看做 A 数据操作辅助 ; 代码示例 : class...friend class StudentCaculate; } 3、单向性 单向性 : 关系是单向 , 声明一个 B 是 另一个 A , B 可以访问 A 所有成员..., 但是 A 不是 B , A 不能访问 B 私有和保护成员 ; 4、继承性 关系不具有继承性 , 即 子类不能直接继承父 ; 5、作用 主要作用 :...作为 某个 数据操作 辅助 ; 作为 多个 之间 传递信息 辅助 ; 二、函数由来 1、函数引入 函数 会破坏 C++ 面向对象 封装性 , 那么为什么还会出现该机制呢

    1.8K10

    【C++】C++中继承,看这一篇就够了

    继承与 关系不能继承,也就是说基不能访问子类私有和保护成员* 六. 继承与静态成员 基定义了static静态成员,则整个继承体系里面只有一个这样成员。...而组合则是一个另一个作为自己成员变量使用 ‌使用场景方面: (2)继承适用于以下情况‌: 当两个具有明显“is-a”关系时,即一个另一个具体化或特例时,使用继承。...例如,如果有一个“动物”,而“狗”是动物一种,那么狗应该继承自动物类‌。 当一个需要使用另一个所有方法或属性时,继承也是一个好选择。...例如,如果一个需要使用另一个大量属性和方法,通过继承可以很方便地获取这些功能‌。 (3)组合适用于以下情况‌: 当两个之间存在“has-a”关系时,即一个作为另一个组件时,使用组合。...组合可以让一个作为另一个组件,而不必暴露其全部接口,从而保持了较高封装性‌。

    8110

    剖析【C++】——和对象(下篇)——超详解——小白篇

    提供了一种特殊机制,可以让一个允许另一个或函数访问其私有或保护成员。虽然增加了便利性,但也会破坏封装性,增加代码耦合度,因此使用时需谨慎。...3.1 函数 问题描述:在重载 operator<< 时,无法将其重载为成员函数,因为 cout 作为输出流对象和 this 指针会竞争第一个参数位置。...但全局函数不能直接访问私有成员,这时就需要函数来解决这个问题。 函数特点: 可以访问私有和保护成员,但不属于成员函数。 不能用 const 修饰。...3.2 是一种所有成员函数都可以访问另一个私有和保护成员机制。 特点: 关系是单向,不具有交换性。...3.3总结: 函数和允许访问私有和保护成员,但要谨慎使用,因为这会增加代码耦合性。 关系是单向,不可传递。 使用友可以解决一些特殊情况下访问权限问题,如重载运算符等。 4.

    7210

    和对象:C++11新特性与知识补充

    (四) 在 C++ 编程中提供了一种突破封装机制,允许非成员函数或其他访问私有和保护成员。包括函数和函数和可以访问私有和保护成员。...函数 定义与作用 函数是一种特殊非成员函数,可以通过函数访问私有和保护成员 在内使用friend关键字声明函数 特点 函数只是声明,所以可以在定义任何地方声明,不受访问限定符限制..._b1 << endl; } int main() { A aa; B bb; func(aa, bb); return 0; } 定义与作用 是一个所有成员函数都可以访问另一个私有和保护成员...在一个内部用 friend class 声明另一个。 特点 关系是单向,不具有交换性。例如,A 是 B ,但是 B 不是 A 关系不能传递。...内部类是⼀个独⽴,只是外部类域限制和访问限定符限制,所以外部类在定义对象时候,其中不包括内部类。 内部类默认是外部类,可以使用外部类成员。

    8910

    【C++篇】继承之巅:超越法则束缚,领略面向对象至臻智慧

    第一章:继承与、静态成员 1.1 继承与 在 C++ 中,是一种特殊机制,它允许指定非成员函数或者其他访问私有成员和保护成员。...然而,关系不能继承,也就是说,基不会自动成为派生,反之亦然。...1.1.1 函数定义 如果基定义了一个函数,该函数只能访问基私有和保护成员,而不能访问派生私有或保护成员。...反之,如果函数在派生中定义,它也无法访问基私有和保护成员。..._studentID return 0; } 在以上代码中,Display 函数是 Person ,它可以访问 Person 保护成员 _name。

    13410

    C++基础(五).多态

    ---- 我们已知道具备封装和信息隐藏特性。...是一种定义在外部普通函数,但他需要在体内进行说明,为了和该类成员函数加以区别,在说明时前面加以关键字friend。不是成员函数,但是他能够访问私有成员。...作用在于提高程式运行效率,但是,他破坏了封装性和隐藏性,使得非成员函数能够访问私有成员 能够是个函数,该函数被称为函数;也能够是个,该类被称为 函数 函数特点是能够访问私有成员非成员函数...函数从语法上看,他和普通函数相同,即在定义上和调用上和普通函数相同 除了前面讲过函数以外,还能够是,即一个能够作另一个。...当一个作为另一个时,这就意味着这个任何成员函数都是另一个函数 Tip: 引自 C++中友详解 ---- 代码示例 要求 用友函数实现clock前置、后置单目运算符重载

    65820

    C++进阶:继承和多态

    上一篇文章:C++进阶:继承 ❤️继承 继承与 关系不能继承,也就是说基不能访问子类私有和保护成员 class Student; class Person { public: friend..._stuNum << endl; } 例如上面这串代码,注释掉那部分 就是错,因为基函数无法访问到派生保护或者私有成员。...变量改成静态成员变量之后 ,改变一个内容,另一个也会跟着改变,从中可以看出其实静态 成员变量只有一份,而且两个静态成员变量是相同。...单继承:一个子类继承一个父属性和方法 多继承:一个子类可以继承多个父属性和方法 什么是菱形继承呢? 类似于下图关系就是菱形继承,菱形继承有什么特点呢?...菱形继承问题发生在一个通过多个路径继承同一个基,从而导致重复继承基成员。 虚拟继承可以解决菱形继承二义性和数据冗余问题。如上面的继承关系,在B和C继承A时使用虚拟继承,即可解决问题。

    7610

    c++与对象(五):、内部类、临时对象、匿名对象

    包括:函数和 1.1函数 函数可以直接访问私有成员,它是定义在外部普通函数,不属于任何,但需要在内部声明,声明时需要在前面加friend关键字 之前我们在重载..._day; return in; } 说明: 函数可访问私有和保护成员,但不是成员函数 函数不能用const修饰 函数可以在定义任何地方声明,不受访问限定符限制 一个函数可以是多个函数...函数调用与普通函数调用原理相同 1.2 所有成员函数都可以是另一个函数,都可以访问另一个非公有成员。...关系不能传递。如果C是B, B是A,则不能说明C时A关系不能继承,在继承位置再给大家详细介绍。..._a << endl;//访问外部类私有变量 } private: int _b; }; private: int _a; }; 其实B就是一个普通,只是A域和访问限定符限制,

    22710

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

    先调用父构造函数 //2.释放时先调用子类析构函数 //子类没有 就使用父方法 //子类有实现,就是用子类重写 //父类型引用 赋值子类型对象 方法都是父类型中方法 void funExtends.../w3cnote/cpp-virtual-functions.html 概念 函数是定义在外部,但有权访问所有私有(private)成员和保护(protected)成员。...尽管函数原型有在定义中出现过,但是函数并不是成员函数。采用friend 关键字 表示。...两种表现形式 函数 实例 class Girl { public: //函数不能使用this friend void modify(Girl *girl, int....png ? 函数.png 模板 模板是泛型编程基础,泛型编程即以一种独立于任何特定类型方式编写代码。

    1.6K40

    【c++】和对象(七)

    、private 访问限定符限制 2. (Friend)在C++中是一个重要概念,它允许某些特定外部函数或访问另一个私有(private)或保护(protected)成员 2.1...: _year(year) , _month(month) , _day(day) {} private: int _year; int _month; int _day; }; 特点: 函数可访问私有和保护成员...,但不是成员函数 函数不能用const修饰 函数可以在定义任何地方声明,不受访问限定符限制 一个函数可以是多个函数 函数调用与普通函数调用原理相同 2.3 所有成员函数都可以是另一个函数...C是B, B是A,则不能说明C时A 关系不能继承 3.内部类 如果一个定义在另一个内部,这个内部类就叫做内部类。...外部类对内部类没有任何优越访问权限 内部类就是外部类,参见定义,内部类可以通过外部类对象参数来访问外部类中所有成员。

    8420

    CC++面试题之语言基础篇(一)

    简述下C++语言特点和对象特点 C++特点: 面向对象 封装和数据隐藏:把相关数据封装成一个“”组件 继承和重写:是子类自动共享父类属性和方法,这是之间一种关系 多态:增强软件灵活性和重用性...继承:继承允许一个继承另一个属性和方法。 多态:多态允许不同类对象对相同消息(方法调用)作出不同响应。...保护成员(protected):子类可以访问父保护成员变量和函数。 私有成员(private):子类不能访问父私有成员变量和函数。...构造函数和析构函数:如果基构造函数和析构函数是公有的,子类可以直接访问它们;如果基构造函数和析构函数是保护或私有的,子类仍然可以访问它们,但只能在子类构造函数和析构函数内部调用它们,不能在外部使用...c++中A访问B私有成员解决方法 使用友函数或:B中声明A,或者在A中声明B 提供公有成员函数或接口:如果希望B私有成员被A间接访问,可以在B中提供一些公有成员函数或接口

    26310

    领悟面向对象就离开发应用不远了(提高)有你对面向对象所有疑问,爆肝1w字

    文章目录 前言 一、面向对象 二、使用 1.基础使用 2.运算符重载 3. 1.函数 2. 3.成员函数 三、继承 基 派生 插个访问权限事情 2.多态 ***公有 **...平常不用,但是有一种地方用了更好:公有方法提供了唯一访问途径,但是有时候不太适用于特定问题,就出现了 1.函数 可以看为扩展接口,直接用吧: //创建函数是将其放入声明中 class...不是成员函数,但是与成员函数访问权限相同 函数主体也有些不同,不能用::作用域 a operator*(double m,const T &t) { //主体随意 } 2. 所有成员函数都是另一个函数...,都可以访问另一个隐藏信息(包括私有成员和保护成员)。...当希望一个可以存取另一个私有成员时,可以将该类声明为另一

    52820

    如何设计优秀API(二)

    只赋予元代码(friend code)访问权限 另一个可以防止“暴露过度”很有用技术是:只给元代码以访问特定功能权限 (例如,实例化某个或者调用某个方法)。...默认情况下,Java要求互为必须在同一个包中。...如果你想把某个功能共享给同一个包中其他,马么你可以给构造器,字段或者方法加上package-private修饰符,这样的话,只有可以进行访问。...但是有的时候,更有用方法是将集合扩展到更广范围中 —— 比如,有人把API纯定义放在一个包中,而其实现放在另一个包中。这种情况下,下面的方法非常有用。...,但是已经可以防止(这些不仅仅只在 api 包中)之外对其进行实例化或者监听事件了。

    43520

    和对象(下)

    • 外部函数可访问私有和保护成员,函数仅仅是⼀种声明,他不是成员函数。 • 函数可以在定义任何地方声明,不受访问限定符限制。 • ⼀个函数可以是多个函数。...• 成员函数都可以是另⼀个函数,都可以访问另⼀个私有和保护成员。 • 关系是单向,不具有交换性,⽐如A是B,但是B不是A。...函数(Friend Function) 函数是一个不是成员函数,但它可以访问该类所有私有成员和保护成员。要定义函数,可以在定义中使用 friend 关键字声明。...尽管 x 是私有成员,但函数可以访问它。 2. (Friend Class) 允许一个访问另一个所有私有和保护成员。...总结: 函数:允许非成员函数访问私有成员。 :允许另一个访问当前所有成员。 成员函数:允许特定成员函数访问私有成员。

    7010

    八、特殊成员

    C++ 中(Friend)是一种定义在之外函数或另一个,但它有权访问私有(private)成员和保护(protected)成员(注意,它不能访问公有成员,因为公有成员默认就是对外开放...; // 访问私有成员x } 则是另一个,它所有成员函数都可以访问当前私有成员和保护成员。...关系建立也是通过在内部声明另一个来实现。...因此,应当谨慎使用友。 非成员函数:函数不是成员函数,它们不能通过对象来调用(尽管通常通过对象作为参数来传递信息)。 单向性:关系不是相互。...访问权限:函数或可以访问其所有私有成员和保护成员,但不能访问其公有成员(因为公有成员默认就是可访问)。

    4810

    和嵌套

    函数用于扩展接口中,并非只能拥有函数,也可以将作为,该类称为。...所有方法都可以访问原始私有成员和保护成员,但也可以对其做更严格限制,使得特定成员函数成为另一个。...和继承、包含关系 我们为什么要提供这种接口呢,它既然可以从外部访问私有部分权限,是不是与我们面向对象编程思想相悖呢?...这表明Remote应该作为TV一个,这样就可以轻松调TV成员和成员函数,来完成自己接口实现。因此不仅没有与面向对象编程思想相悖,而且提高了公有接口灵活性。...声明位置决定了作用域和可见性。可见后,访问控制规则(公有、私有、保护)决定程序对嵌套成员访问权限。

    73440

    【C++和对象】探索static成员、以及内部类

    2.(friend) (friend)是C++中一个特殊关键字,用于在中声明其他或函数为或函数可以访问声明它为私有成员和保护成员。.../ 可以访问A私有成员和保护成员 } 例如之前写过流输入输出重载就使用了函数,以此来访问私有成员; 注意: 函数可访问私有和保护成员,但不是成员函数 函数不能用const修饰...函数可以在定义任何地方声明,不受访问限定符限制 一个函数可以是多个函数 函数调用与普通函数调用原理相同 2.2中声明另一个。...可以访问声明它为所有私有成员和保护成员。...✨关系提供了一种在需要情况下访问其他私有成员机制。但由于关系破坏了封装性,一般不使用。 ✨内部类是指在一个内部定义另一个

    13110
    领券