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

为什么友元函数仅在使用公共继承时才可用于派生类?

友元函数是一种特殊的函数,它可以访问类的私有成员和保护成员。在C++中,友元函数仅在使用公共继承时才可用于派生类的原因如下:

  1. 公共继承(public inheritance)是一种继承方式,它使得派生类可以访问基类的公有成员。友元函数需要访问类的私有成员和保护成员,而公共继承是派生类能够访问基类公有成员的前提条件。因此,只有在使用公共继承时,派生类才能够使用友元函数。
  2. 友元函数的作用是为了提供对类的访问权限的特殊需求,而不是为了满足派生类的特殊需求。友元函数可以在类外部定义,但它们被声明为类的友元函数,以便能够访问类的私有成员和保护成员。由于友元函数的作用范围是类本身,而不是派生类,所以友元函数在使用公共继承时才可用于派生类。

总结起来,友元函数仅在使用公共继承时才可用于派生类,是因为公共继承使得派生类能够访问基类的公有成员,而友元函数需要访问类的私有成员和保护成员。友元函数的作用是为了提供对类的访问权限的特殊需求,而不是为了满足派生类的特殊需求。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++一分钟之-成员访问控制:public, private, protected

访问控制基础 public(公共) 含义:公开的,任何地方都能访问。 用途:通常用于类的接口部分,如成员函数和需要外部直接操作的数据成员。 private(私有) 含义:私有的,仅在类内部访问。...用途:用于继承关系中,提供一种受限的访问方式,使得子类可以访问父类的某些成员,同时保持对外界的隐藏。 常见问题与避免策略 1....忽视继承中的访问权限变化 问题:错误地认为基类的protected或private成员在派生类中会变为public。...避免:了解并牢记继承中访问权限的规则,private成员在派生类中仍然是不可访问的,而protected成员在派生类中变为访问。 3....使用函数类过度破坏封装 问题:为了方便访问私有成员而随意声明,降低了类的封装性。 避免:谨慎使用友元功能,仅在确实需要且无其他更好方案考虑,确保类的设计依然保持良好的封装性。

60110

(暑假提升-继承专题)

下面我们使用监视窗口查看Student和Teacher对象, 以看到变量的复用。调用Print可以看到成员函数的复用。...基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就定义为protected。 可以看出保护成员限定符是因继承出现的。...使用关键字class默认的继承方式是private,使用struct默认的继承方式是public,不过最好显示的写出继承方式。...析构显示派生类析构然后再是基类。 2、6、继承中的特点 2、6、1、 在基类的定义中可能存在的存在在继承中又有什么样的特性呢?...首先,是不能够继承的 简单点意思就是你爸爸的朋友不是你的朋友。基类的不能够访问子类的私有和保护成员。

7610
  • 纯虚函数

    抽象类的定义: 称带有纯虚函数的类为抽象类 抽象类的作用 抽象类的主要作用是将有关的操作作为结果接口组织在一个继承层次结构中,由它来为派生类提供一个公共的根,派生类将具体实现在其基类中作为借口的操作...使用抽象类注意: 抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。如果派生类中没有重新定义纯虚函数,而只是继承基类的纯虚函数,则这个派生类仍然是一个抽象类。...实现了纯虚函数的子类,该纯虚函数在子类中就变成了了虚函数,子类的子类可以覆盖该虚函数,由多态方式调用的时候动态绑定。 虚函数是C++中用于实现多态的机制。核心理念就是通过基类访问派生类定义的函数。...在有动态分配堆上内存的时候,析构函数必须是虚函数,但没有必要是纯虚的。 不是成员函数,只有成员函数可以使虚拟的,因此不能是虚拟函数。...但可以通过让函数调用虚拟成员函数来解决的虚拟问题。 析构函数应当是虚函数,将调用相应对象类型的析构函数。因此,如果指针指向的是子类对象,将调用子类的析构函数,然后自动调用基类的析构函数

    1.1K20

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

    通常情况下只有成员函数(或者)中的代码需要使用作用域运算符来回避虚函数的机制。...受保护成员 一个protected关键字声明它希望与派生类分享但是不想被其他公共访问使用的成员: 和私有成员类似,受保护的成员对于类的用户来说不可访问 和公有成员类似,受保护的成员对派生类的成员和来说是访问的...派生类向基类转换的访问性 假定D继承B: 只有当D公有地继承B,用户代码才能使用派生类向基类的转换;如果D继承B的方式是受保护的或者私有的,则用户代码不能使用该转换 无论D以什么方式继承B,D的成员函数都能使用派生类向基类的转换...;派生类向其直接基类的类型转换对于派生类的成员和来说永远是访问的 如果D继承B的方式是公有的或者受保护的,则D的派生类的成员和可以使用D向B的类型转换,反之如果D继承B的方式是私有的,则不能使用...对于前者应该声明为受保护的,这样派生类就能在实现自己的功能使用基类的这些操作和数据;对于后者应该声明为私有的。 4. 继承 就像关系不能传递一样,关系同样也不能继承

    1.2K20

    C++类和对象 的复习

    函数 内联函数 类的静态成员 类访问修饰符 继承 特点 基类/派生类继承 运算符/函数重载 多态 类和结构体的区别 C++ 中保留了C语言的 struct 关键字,并且加以扩充。...尽管函数的原型有在类的定义中出现过,但是函数并不是成员函数可以是一个函数,该函数被称为函数也可以是一个类,该类被称为类,在这种情况下,整个类及其所有成员都是。...只有当函数只有 10 行甚至更少时将其定义为内联函数. 类的静态成员 静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句,在创建第一个对象,所有的静态数据都会被初始化为零。...Protected成员变量或函数与私有成员十分相似,但有一点不同,protected(受保护)成员在派生类(即子类)中是访问的。...成员只能被本类成员(类内)和访问,不能被派生类访问; 2.protected 成员可以被派生类访问。

    55030

    【笔记】《C++Primer》—— 第15章:面向对象程序设计

    ,这个绑定在运行时才会确定,因此我们必须对每个虚函数都进行定义因为对虚函数的调用在运行时解析,编译器也不能确定是否会被用到 运用这个动态绑定就是C++OOP的核心,多态性 一个派生类函数如果想要覆盖继承来的虚函数...=0,我们只能对虚函数使用这个写法 我们也可以为纯虚函数写定义,但是定义必须写在类外 15.5 访问控制和继承 访问控制中最难理解的是protected,这表示那些希望与派生类分享使用但不希望被公共函数使用的成员...派生类可以自己将某些函数写为friend,这样会获得其基类的protected权限 只对被声明的类有效,的基类或派生类都不是 派生类的成员和只能通过派生类对象来访问基类的protected...也就是当一个派生类与基类声明为,此时想要访问基类的保护成员,必须通过派生类作为中介而不能直接用基类来访问,即使在成员函数中。详细如下 ?...,其余时候都不能转换 无论是什么继承派生类都可以在成员中使用派生到类的转换 public和protected继承派生类自己的派生类可以使用派生到基类的转换,private则不行 总结起来

    52320

    c++类和继承面试点25连问

    ,此时我们把类A的析构函数修改为virtual,看看结果: A() B() ~B() ~A() 一般情况下,只有当一个类被用作基类需要使用虚析构函数,这样做的作用是当一个基类的指针删除派生类的对象...以上三种情况都必须使用初始化列表而不能在构造函数中进行赋值。 10. 什么情况下要使用继承? 多重继承需要使用继承,一般的我们在多重继承使用继承来防止二义性问题。...类是什么 与函数类似,在一个类A中声明另外一个类B为friend类型,那么这个类B就是类,它访问类A的私有成员和保护成员都不受限制。...有关详细说明,请看这篇文章:c++类访问权限及 19....是否违反了封装的原则 违反了,函数可以不受访问权限的限制而访问类的任何成员,也就是它可以直接接触类的实现,当然违反了封装的原则,只是有时基于我们自身的某些使用场景,不得不使用。 20.

    98410

    【C++】继承

    (取权限小的那个) 使用关键字class默认的继承方式是private,使用struct默认的继承方式是public,不过最好显示的写出继承方式。...继承 关系不能继承,也就是说基类不能访问子类私有和保护成员 class Student; class Person { public: friend void Display(const..._stuNum << endl; } int main() { Person p; Student s; Display(p, s); } 不能访问父类的: 想要访问父类的,那么直接让这个函数也成为子类的...: 一个类可以同时是多个类的函数。...为了解决这个问题提出了虚继承。 虚拟继承可以解决菱形继承的二义性和数据冗余的问题。如上面的继承关系,在Student和Teacher的继承Person使用虚拟继承,即可解决问题。

    11510

    C++雾中风景1:类与面向对象

    接下来我们来分析一下函数的特点。 1、为什么要引入函数: 在实现类之间数据共享,减少系统开销,提高效率。具体来说:为了使其他类的成员函数直接访问该类的私有变量。...2)两个类要共享数据的时候 3、方式的缺点: 1)函数破环了封装机制,除非不得已的情况下使用函数。 2.关系与面向对象: 接下来我们聊聊怎么从面向对象的角度去理解关系。...所以如果本身代码风格趋近与面向对象的风格,就应该尽量理由类来实现需要的功能,而不是使用函数。...看起来并不会破坏上文提到的面向对象的逻辑了,但是涉及到继承又存在一些不大不小的坑,我们一起来捋一捋: 关系不能继承。基类的派生类的成员没有特殊访问权限。...如果基类被授予关系,则只有基类具有特殊访问权限,该基类的派生类不能访问授予关系的类。

    77530

    【C++】继承(定义、菱形继承、虚拟继承

    基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在 派生类中能访问,就定义为protected。可以看出保护成员限定符是因继承出现的。...使用关键字class默认的继承方式是private,使用struct默认的继承方式是public,不过 最好显示的写出继承方式。...基类和派生类对象赋值转换 派生类对象可以赋值给基类对象。 注意:必须是公有继承可以,保护和私有都不行。 public继承是is -a的关系,即每个子类对象都是一个特殊的父类对象。...而父类成员可以看作是一个自定义类型成员,会回去父类找默认构造函数继承 关系不能继承,也就是说基类不能访问子类私有和保护成员 。...如上面的继承关系,在Student和 Teacher的继承Person使用虚拟继承,即可解决问题。

    14310

    第 15 章 面向对象程序设计

    假定 D继承自 B: 只有当 D公有地继承 B,用户代码才能使用派生类向基类的类型转换;如果 D继承 B的方式是受保护的或私有的,则用户代码不能使用该转换。...不论 D以什么方式继承 B,D的成员函数都能使用派生类向基类的类型转换;派生类向其直接基类的类型转换对于派生类的成员和来说永远是访问的。...如果 D继承 B的方式是公有或受保护的,则 D的派生类的成员和使用 D向 B的类型转换;反之,如果 D继承 B的方式是私有的,则不能使用。 就像关系不能传递一样,关系同样也不能继承。...基类的在访问派生类成员不具特殊性,类似的,派生类也不能随意访问基类的成员。但是基类的是可以访问内嵌在派生类对象中的基类成员。...派生类定义的构造函数与基类的构造函数具有相同的形参列表,则该构造函数不会被继承派生类使用的是自己定义的相应函数。 默认、拷贝和移动构造函数不会被继承,这些构造函数按照正常规则被合成。

    1K30

    《C++面向对象程序设计》✍千处细节、万字总结(建议收藏)「建议收藏」

    4.3 string类 4.4 向函数传递对象 4.5 静态成员 4.6 函数 类 4.7 类的组合 4.8 共享数据的保护 五、继承与派生 5.1 继承与派生的概念 基类成员在派生类中的访问属性...包括函数类。 函数 函数既可以是不属于任何类的非成员函数,也可以是另一个类的成员函数。...尤其当一个函数需要访问多个类函数非常有用,普通的成员函数只能访问其所属的类,但是多个类的函数能够访问相关的所有类的数据。...//声明类Y为类X的类 }; 当一个类被说明为另一个类的,它所有的成员函数都成为另一个类的函数,这就意味着作为类中的所有成员函数都可以访问另一个类中的所有成员。...若基类使用默认构造函数或不带参数的构造函数,则在派生类中定义构造函数略去“:基类构造函数名(参数表)”,此时若派生类也不需要构造函数,则可不定义构造函数

    3.3K40

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

    文章目录 前言 一、面向对象 二、使用类 1.类的基础使用 2.运算符重载 3. 1.函数 2.类 3.成员函数 三、类继承 基类 派生类 插个访问权限的事情 2.多态 ***公有 **...意义:如果不做特殊处理,C++ 的 +、-、*、/ 等运算符只能用于对基本类型的常量或变量进行运算,不能用于对象之间的运算,运用与对象处理 3. 怎么说这个呢?...平常不用,但是有一种地方用了更好:公有类方法提供了唯一的访问途径,但是有时候不太适用于特定的问题,就出现了 1.函数 可以看为类的扩展接口,直接用吧: //创建函数是将其放入类声明中 class...当希望一个类可以存取另一个类的私有成员,可以将该类声明为另一类的类。...(继承了基类的实现) 派生类继承了基类的接口 当然派生类和其他类的使用方法大致一样:可以有自己的构造函数,可以添加额外的数据成员和成员函数 插个访问权限的事情 首先派生类不能直接访问基类的私有成员,

    52820

    C++:43---派生类向基类转换、静态动态的类变量

    此时基类可以通过指针或引用指向派生类(相当于将派生类从基类中继承的那部分方法和成员绑定到基类上了,相当于派生类被截断了),然后基类就可以将派生类假装是一个基类对象来使用(调用其中的成员/方法) ②为什么基类不能转换为派生类...三、继承方式对类型转换的影响 遵循下面3个规则: 假设B继承于A ①只有当B公有地继承A,用户代码才能使用派生类向基类转换;如果B是受保护的/私有的继承于A,则不能使用派生类向基类转换 因为保护或者私有继承...A,B的成员函数中可以将派生类对象向基类转换 class A{}; class B :protected A { void func() { A *a; B b; a = &b; //正确,成员函数内可以...a = this; //正确,成员函数内可以 } friend void func2(); //函数 }; void func2() { A *a; B b; a = &b; //正确,函数内可以...} int main() { A *a; B b; a = &b; //错误,因为为保护继承 return 0; } ③如果B继承于A的方式是公有的或者受保护的,则B的派生类的成员和可以使用B向A

    1.7K10

    C++基础知识精髓

    使用注意: (1) 关系不能被继承。 (2) 关系是单向的,不具有交换性。若类B是类A的,类A不一定是类B的,要看在类中是否有相应的声明。 (3) 关系不具有传递性。...4.类必须将重载函数集中每一个希望设为函数都声明为。 5.关系不能继承,基类的派生类的成员没有特殊的访问权限。如果基类被授予关系,则只有基类具有特殊的访问权限。...// 在多继承,如果省略继承方式,默认为private // 如果在派生类中声明了一个与基类成员相同名字的函数派生类的新成员会覆盖基类的同名成员 /* 不管何种继承 基类的私有程序都不能被派生类继承...否则会破坏C++的封装特性 * 基类的函数也不能被继承只是能访问指定类的私有和保护成员的自定义函数,不是被指定类的成员,自然不能继承 * 基类与派生类的静态成员函数与静态成员是共用一段空间的...编译器确保当对象为派生类派生类的实现总是被调用,即使对象是使用基类指针访问而不是派生类的指针。

    2K50

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

    基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就定义为protected。可以看出保护成员限定符是因继承出现的。...**使用关键字class默认的继承方式是private,使用struct默认的继承方式是public,**不过最好显示的写出继承方式。...继承 关系不能继承,也就是说基类不能访问子类私有和保护成员* 六. 继承与静态成员 基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。...而组合则是一个类将另一个类作为自己的成员变量使用使用场景方面: (2)继承用于以下情况‌: 当两个类具有明显的“is-a”关系,即一个类是另一个类的具体化或特例使用继承。...例如,如果一个类需要使用另一个类中的大量属性和方法,通过继承可以很方便地获取这些功能‌。 (3)组合适用于以下情况‌: 当两个类之间存在“has-a”关系,即一个类作为另一个类的组件使用组合。

    8210

    C++进阶:详细讲解继承

    基类的其他成员在子类的访问方式相等于Min(成员在基类的访问限定符,继承方式),public > protected > private 使用关键字class默认的继承方式是private,使用...在实际运用中一般使用都是public继承,几乎很少使用protetced/private继承,也不提倡使用protetced/private继承,因为protetced/private继承下来的成员都只能在派生类的类里面使用...原则: 父类那部分调用父类的对应函数完成 5.继承 关系不能继承,也就是说基类不能访问子类私有和保护成员 class A { public: int _pa; friend...void print(B& bb);//这个print是A的 protected: int _a; }; class B :public A { public: int _pb; protected...如上面的继承关系,在Student和Teacher的继承Person使用虚拟继承(在:后面加上virtual),即可解决问题。需要注意的是,虚拟继承不要在其他地方去使用

    15310

    C++继承

    基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在 派生类中能访问,就定义为protected。可以看出保护成员限定符是因继承出现的。 3....使用关键字class默认的继承方式是private,使用struct默认的继承方式是public,不过 最好显示的写出继承方式。 5....为了保证先调用子类的析构函数,父亲的析构会在子类析构后自动调用。 构造:先父后子 析构:先子后父 为什么析构函数是先子后父呢?...唯一不同的是,不管是构造初始化/拷贝/析构,多了父类那一部分,原则:父类那部分调用父类对应的函数 五、继承 关系不能继承,父类的不是子类的。...需要注意的是,虚拟继承不要在其他地方去使用。 就是因为student 和 teacher 继承person这个类,导致了后续的二义性,因此需要这两个类上加上虚拟继承

    6810

    继承

    继承就体现了它用法,当为protected继承的时候,在派生类的里面是可以访问到基类的成员的。 大多数的情况下都是公共继承的,因为继承之后在派生类的外面是可以访问的。...要显示基类的类域可以访问,没有显示类域默认访问派生类中的。 注意:只要名字一样就构成隐藏。...2.当基类没有默认的构造函数的时候,必须自己要写构造函数调用基类的 派生类的构造函数先初始化基类,再初始派生类中的成员 静态成员变量不属于具体的类对象,属于该类所有对象。...继承 是不能继承的——基类不能访问派生类的私有和保护成员。...菱形继承与菱形虚拟继承 菱形继承 什么是菱形继承? 如下图:B继承了A,C也继承了A,D既继承了B也继承了C。这种继承关系就是菱形继承 为什么会出现菱形继承

    25240
    领券