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

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

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

1.1K20

【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.2K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

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

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

    6710

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

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

    8310

    C++基础(五).多态

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

    65420

    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域和访问限定符限制,

    21210

    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.5K40

    【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.内部类 如果一个定义在另一个内部,这个内部类就叫做内部类。...外部类对内部类没有任何优越访问权限 内部类就是外部类,参见定义,内部类可以通过外部类对象参数来访问外部类中所有成员。

    7820

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

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

    22510

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

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

    52220

    如何设计优秀API(二)

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

    43220

    和嵌套

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

    72340

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

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

    12210

    C++基础知识精髓

    在C++中,结构可作为一种特殊,它虽然可以包含函数,但是它没有私有或保护成员。 C++中包含私有、公有和保护成员,C++中可定义三种不同访控制权限成员。...所有成员函数都是另一个函数,都可以访问另一个隐藏信息(包括私有成员和保护成员)。 当希望一个可以存取另一个私有成员时,可以将该类声明为另一。...例如,以下语句说明B是A: class A { … public: friend class B; … }; 经过以上说明后,B所有成员函数都是A函数,能存取A私有成员和保护成员...否则会破坏C++封装特性 * 基函数也不能被继承,只是能访问指定私有和保护成员自定义函数,不是被指定成员,自然不能继承 * 基与派生静态成员函数与静态成员是共用一段空间...,在外也不能访问 // protected保护继承 特点是基所有公有成员和保护成员都成为派生保护成员,并且只能被它派生成员函数或访问,基私有成员仍然是私有的 // private私有继承

    2K50

    《挑战30天C++入门极限》入门教程:实例详解C++

    入门教程:实例详解C++   在说明什么是之前,我们先说明一下为什么需要缺点:   通常对于普通函数来说,要访问保护成员是不可能,如果想这么做那么必须把成员都生命成为...能够使得普通函数直接访问保护数据,避免了成员函数频繁调用,可以节约处理器开销,提高程序效率,但矛盾是,即使是最大限度保护,同样也破坏了封装特性,这即是缺点,在现在cpu速度越来越快今天我们并不推荐使用它...,我们成功访问到了a对象保护成员name,函数并不能看做是成员函数,它只是个被声明为普通函数,所以在外部函数定义部分不能够写成void Internet::ShowN(Internet...a("中国软件开发实验室","www.cndev-lab.com"); Country b; b.Editurl(a); cin.get(); }   整个也可以是另一个...每个成员函数都可以访问另一个所有成员。

    43120

    函数 声明函数 函数可以直接访问私有成员,它是定义在外部普通函数,不属于任何,但需要在内部声明,声明时需要加friend关键字。...一般成员函数只可以访问一个私有和保护成员,但函数可以访问多个私有和保护函数。 函数可以绕过成员函数,直接访问私有和保护函数,这样就避免了调用成员函数相关开销。...如果没有元功能,一个函数要想访问某个私有和保护成员时,只能是将这个成员设置为公共,这样一来用户就可以访问该类中所有成员,从而破坏了信息隐蔽性。 由于函数不是本类成员函数。...所以必须用对象名或对象引用作为函数形参,并在函数体内使用运算符“.”来访问对象成员。... 所有成员函数都可以是另一个函数,都可以访问另一个非公有成员。 关系是单向,不具有交换性。

    64020

    从零开始学C++之友函数和

    一、介绍 我们知道,成员函数可以访问同类其他成员函数,包括公有、私有和保护成员。而外部函数只能访问公有成员。 是一种允许非类成员函数访问非公有成员一种机制。...可以把一个函数指定为,也可以把整个指定为另一个。...但函数可以访问所有成员(公有的、私有的、保护),一般函数只能访问公有成员。 2、函数不受访问权限关键字限制,可以把它放在公有、私有、保护部分,但结果一样。...三、 如果某类B成员函数会频繁存取另一个A数据成员, 而A数据成员Private/Protectd限制造成B存取麻烦, B只能通过APublic成员函数进行间接存取 把B做成A...,即A向B开放其Private/Protectd内容, 让B直接存取 :一个可以作另一个 所有成员函数都是另一个函数 声明: friend class 名;

    73400

    C++面向对象编程一些拾遗

    有三种: 函数(非成员函数) 函数(成员函数) 1. 函数。 一个函数虽然不是成员函数却需要访问所有成员,这样函数可以定义为函数。...当需要一个去访问另一个所有成员时,可以将此类声明为另一个。当A是B时,A可以访问B所有成员,包括私有成员和保护成员。...三点需要注意: 1) 关系是单向,A是B,B 不一定是A。 2) 关系不能够被继承。 3) 关系不具有传递性。 3....成员函数 可以把一个成员函数声明为另一个函数,值得注意是,如果需要把B成员函数声明做A,首先需要声明A,然后定义B,B成员函数要使用A,然后再去定义A,定义了A之后才能去定义...可以看出,我们在构造一个flyhorse对象时候,发生了五次构造,其中基被构造了2次,二义性就是从这里产生。 C++解决这种问题方法是采用虚基方法,也可以称作为虚继承。

    68920

    深入理解面向对象编程特性 : 继承

    “has a”关系通常表示组合(Composition)或聚合(Aggregation)关系,即一个包含另一个作为其成员。这种关系强调一个拥有另一个实例。...法 /*Base() {}*/ } 继承:&静态成员 继承与 关系不继承: 在C++中,关系是特定于某个。...一个函数或如果是父,它不会自动成为子类。因此,父函数不能访问子类私有成员和保护成员。同样地,如果你希望某个函数既是父,又是子类,也可以在子类中声明该函数。...原因是关系不继承:Display函数虽然是Person,但它不是Student,所以不能访问Student保护成员。...组合(Composition) 组合是一种has-a关系,表示一个拥有另一个实例。这种方式通过将一个对象作为另一个对象成员变量来实现代码复用。

    7110
    领券