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

如何对基类中的派生类函数加好友?

在面向对象编程中,基类和派生类是继承关系中的两个概念。基类是派生类的父类,派生类继承了基类的属性和方法,并可以在此基础上添加自己的属性和方法。

要对基类中的派生类函数加好友,可以通过以下步骤实现:

  1. 定义基类和派生类:首先需要定义一个基类和一个派生类。基类中可以包含一些公共的属性和方法,派生类可以继承这些属性和方法,并添加自己特有的属性和方法。
  2. 声明派生类为基类的友元:在基类中,通过在类的声明中使用friend关键字,将派生类声明为基类的友元。这样派生类就可以访问基类的私有成员。
  3. 在派生类中访问基类的函数:在派生类中,可以直接调用基类的函数,包括公有函数和受保护函数。通过继承和友元声明,派生类可以访问基类中的私有函数。

下面是一个示例代码:

代码语言:cpp
复制
#include <iostream>
using namespace std;

class Base {
private:
    void privateFunc() {
        cout << "This is a private function in Base class." << endl;
    }

protected:
    void protectedFunc() {
        cout << "This is a protected function in Base class." << endl;
    }

public:
    void publicFunc() {
        cout << "This is a public function in Base class." << endl;
    }

    friend class Derived; // 将Derived类声明为Base类的友元
};

class Derived : public Base {
public:
    void callBaseFunc() {
        publicFunc(); // 可以直接调用基类的公有函数
        protectedFunc(); // 可以直接调用基类的受保护函数
        // privateFunc(); // 无法直接调用基类的私有函数,会编译错误
    }
};

int main() {
    Derived derived;
    derived.callBaseFunc();

    return 0;
}

在上述示例中,基类Base中有一个私有函数privateFunc()和一个受保护函数protectedFunc(),并将派生类Derived声明为基类的友元。在派生类Derived中的callBaseFunc()函数中,可以直接调用基类的公有函数publicFunc()和受保护函数protectedFunc(),但无法直接调用基类的私有函数privateFunc()

这样,就实现了对基类中的派生类函数的访问。

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

相关·内容

派生类对基类中虚函数和非虚函数的继承效果

而虚函数的作用,主要是为了让父类指针可以调用子类的函数,这种是在运行时才决定调用哪个函数 1、虚函数:   C++的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现。...子类可以重写父类的虚函数实现子类的特殊化。 2、纯虚函数:   C++中包含纯虚函数的类,被称为是“抽象类”。抽象类不能使用new出对象,只有实现了这个纯虚函数的子类才能new出对象。   ...C++中的纯虚函数更像是“只提供申明,没有实现”,是对子类的约束,是“接口继承”。   C++中的纯虚函数也是一种“运行时多态”。...3、普通函数:   普通函数是静态编译的,没有运行时多态,只会根据指针或引用的“字面值”类对象,调用自己的普通函数。   普通函数是父类为子类提供的“强制实现”。   ...因此,在继承关系中,子类不应该重写父类的普通函数,因为函数的调用至于类对象的字面值有关。 参考链接

9210

C++中派生类对基类成员的访问形式

C++中派生类对基类成员的访问形式主要有以下两种: 1、内部访问:由派生类中新增成员对基类继承来的成员的访问。 2、对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问。...今天给大家介绍在3中继承方式下,派生类对基类成员的访问规则。...基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类的成员还是通过派生类的对象,都无法直接访问从基类继承来的private成员,但是可以通过基类提供的public成员函数间接访问。...基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类成员还是派生类的对象,都无法直接访问从基类继承来的private成员,但是可以通过基类提供的public成员函数直接访问它们。...基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类成员还是通过派生类的对象,都无法直接访问基类中的private成员。

2.4K70
  • 从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换

    一、不能自动继承的成员函数 构造函数(包括拷贝构造函数) 析构函数 =运算符 二、继承与构造函数 基类的构造函数不被继承,派生类中需要声明自己的构造函数。...声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化调用基类构造函数完成(如果没有给出则默认调用默认构造函数)。...派生类的构造函数需要给基类的构造函数传递参数 #include  using namespace std; class ObjectB { public:     ObjectB...从输出可以看出: 派生类对象的构造次序: 先调用基类对象成员的构造函数,接着是基类的构造函数,然后是派生类的对象成员的构造函数,最后是派生类自身的构造函数。...四、派生类到基类的转换 当派生类以public方式继承基类时,编译器可自动执行的转换(向上转型 upcasting 安全转换) 派生类对象指针自动转化为基类对象指针 派生类对象引用自动转化为基类对象引用

    1.5K00

    如何对类中的private方法进行测试?

    问题:如何对类中的private方法进行测试? 大多数时候,private都是给public方法调用的,其实只要测试public即可。...但是有时由于逻辑复杂等原因,一个public方法可能包含了多个private方法,再加上各种if/else,直接测public又要覆盖其中每个private方法的N多情况还是比较麻烦的,这时候应该考虑单对其中的...那么如何进行呢? 思路: 通过反射机制,在testcase中将私有方法设为“可访问”,从而实现对私有方法的测试。...假设我们要对下面这个类的sub方法进行测试 class Demo{ private function sub($a, $b){ return...这也是为什么对protected方法更建议用继承的思路去测。 附: 测试类改写为下面这种方式,个人感觉更清晰。

    3.4K10

    SqlParameter类中的两对好基友:SqlDbType与DbType、SqlValue与Value

    这两对属性光从MSDN上看不出什么区别,在到底选用其中哪个属性时给我造成过困扰,后来冥冥中觉得它们之间可能有关联,遂决定实验一下: 果然,它们之间内部是私通的,赋值其中一个,另一个会跟着改变。...通过反编,发现SqlDbType和DbType是通过一个叫MetaType的类实现的私通(这个类是internal的,所以外部不能访问),而SqlValue和Value则是通过SqlParameter类中的一个私有字段...总之知道这两对基友有联动就行了,以后不用再纠结用哪一个。...(v=vs.80).aspx 关于SqlDbType和DbType的对应关系,可参看此表(但其中SqlDbType其实不是指SqlDbType枚举,但意思是明白的):http://msdn.microsoft.com.../zh-cn/library/system.data.sqltypes(v=vs.80).aspx PS:原来cnblogs的超链是默认原窗口打开,我想骂人

    68520

    C++新旅程:三大特性之继承,详细介绍

    4.派生类的构造函数和析构函数4.1构造函数派生类不继承基类的构造函数,在声明派生类时一般应定义自己的构造函数 注意派生类构造函数的总参数表中的参数,应当包括调用基类构造函数所需的参数 派生类构造函数的执行过程是...,效率高写法二这种写法相对比较麻烦,写的形参更多了4.1.2派生类构造函数的执行顺序结论:先调用基类构造函数,对基类数据成员初始化再调用子对象类的构造函数,对子对象的数据成员初始化最后执行派生类构造函数体中的语句...,对派生类新增数据成员初始化4.2析构函数1.派生类不继承基类的析构函数,在声明派生类时,应当定义自己的析构函数2.派生类的析构函数只对新增成员进行清理工作,基类、子对象的清理工作仍由它们各自的析构函数负责...3.在执行派生类的析构函数时,系统会自动调用基类的析构函数和子对象的析构函数,分别对基类和子对象进行清理4.析构函数的执行顺序与构造函数正好相反 先执行派生类自己的析构函数,对派生类新增成员进行清理;...,子类会隐藏父类中同名成员函数,加作用域可以访问到父类中同名函数补充继承同名静态成员处理方式问:继承中同名的静态成员在子类对象上如何进行访问?

    12410

    (超级清晰易懂版)多态--C++

    说明:要实现多态效果,第⼀必须是基类的指针或引用,因为只有基类的指针或引用才能既指向派生类对象;第二派生类必须对基类的虚函数重写/覆盖,重写或者覆盖了,派生类才能有不同的函数,多态的不同形态效果才能达到...基类的析构函数为虚函数,此时派生类析构函数只要定义,⽆论是否加virtual关键字,都与基类的析构函数构成重写,虽然基类与派⽣类析构函数名字不同看起来不符合重写的规则,实际上编译器对析构函数的名称做了特殊处理...但是要注意的这里继承下来的基类部分虚函数表指针和基类对象的虚函数表指针不是同一个,就像基类对象的成员和派生类对象中的基类对象成员也独立的。...• 派生类中重写的基类的虚函数,派生类的虚函数表中对应的虚函数就会被覆盖成派生类重写的虚函数地址。...• 派生类的虚函数表中包含,基类的虚函数地址,派生类重写的虚函数地址,派生类自己的虚函数地址三个部分。

    5300

    《C#图解教程》读书笔记之四:类和继承

    一、万物之宗:Object   (1)除了特殊的Object类,其他所有类都是派生类,即使他们没有显示基类定义。   (2)一个派生类只能有一个基类,叫做单继承。 ?...二、基类那点事儿   (1)如何在派生类中访问基类成员?使用base关键字,如base.Field1;   (2)如何屏蔽基类中某个方法或成员?在派生类定义的成员定义前使用new关键字; ?   ...(3)如何使用基类的引用?这里可以借鉴里氏替换法则,创建指向派生类的基类对象。 ? 三、小字符有大学问:成员访问修饰符 ?   ...;   (4)internal:对程序集内部的所有类可见;   (5)protected internal:对所有继承自该类的派生类的成员以及所有程序集内部的类可见; ?...四、密封类与静态类   (1)密封类:无法被继承,需要使用sealed修饰符;   (2)静态类:       ①类的所有成员必须是静态的;       ②类可以有一个静态构造函数,但不能有实例构造函数

    67140

    【C++从小白到大牛】多态那些事儿(上)

    在继承中要多态还要两个条件 父类指针或引用去调用虚函数,这样才能保证传父类对象调用的就是父类的虚函数,传子类对象,调用的是子类的虚函数(调用子类传子类利用切片的原理) 虚函数完成重写:父子类中的两个虚函数...派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。...所以我们如何才能变成多态调用呢? 在子类和基类的析构函数都加上virtual构成重写,变为多态调用。那这里违反重写的规则,函数名都不相同,怎么能构成重写呢?...TIP:特殊情况 如果基类的析构函数为虚函数,此时派生类析构函数只要定义,无论是否加virtual关键字,都与基类的析构函数构成重写。...重定义(隐藏) 两个函数分别在基类和派生类的作用域 函数名相同 两个基类和派生类的同名函数不构成重写就是重定义 四、多态的原理 4.1虚函数表 先做一道笔试题: // 这里常考一道笔试题:sizeof

    10110

    C++之虚函数的作用和使用方法

    用同一种调用形式“pt->display()”,而且pt是同一个基类指针,可以调用同一类族中不同类的虚函数。这就是多态性,对同一消息,不同对象有 不同的响应方式。...可以看到:当把基类的某个成员函数声明为虚函数后,允许在其派生类中对该函数重新定义,赋予它新的功能,并且可以通过指向基类的指针指向同一类族中不同类的对象,从而调用其中的同名函数。...由虚函数实现的动态多态性就是:同一类族中不同类的对象,对同一函数调用作出不同的响应。 虚函数的使用方法是: 在基类用virtual声明成员函数为虚函数。...因此在派生类重新声明该虚函数时,可以加virtual,也可以不加,但习惯上一般在每一层声明该函数时都加virtual,使程序更加清晰。...如果在派生类中没有对基类的虚函数重新定义,则派生类简单地继承其直接基类的虚函数。 定义一个指向基类对象的指针变量,并使它指向同一类族中需要调用该函数的对象。

    1.4K80

    《挑战30天C++入门极限》图例实解:C++中类的继承特性

    public空格加基类名称进行定义,如上面代码中的class Car:public Vehicle。   ...至于为什么派生类能够对基类成员进行操作,我们上图可以简单的说明基类与子类在内存中的排列状态。   ...我们知道,类对象操作的时候在内部构造的时候会有一个隐的this指针,由于Car类是Vehicle的派生类,那么当Car对象创建的时候,这个this指针就会覆盖到Vehicle类的范围,所以派生类能够对基类成员进行操作...由上面的例程我们知道Car类是Vehicle类的派生类(子类),c++规定,创建派生类对象的时候首先调用基类的构造函数初始化基类成员,随后才调用派生类构造函数。   ...但是要注意的是,在创建派生类对象之前,系统首先确定派生类对象的覆盖范围(也可以称做大小尺寸),上面代码的派生类对象a就覆盖于Vehicle类和Car类上,至于派生类对象的创建是如何构造基类成员的,我们看如下代码

    40920

    多态之魂:C++中的优雅与力量

    虚函数和继承 运行时多态的核心是虚函数。在基类中使用virtual关键字声明一个函数,派生类可以重写该函数,当通过基类指针或引用调用这个函数时,会自动调用派生类中的实现。...说明:要实现多态效果,第⼀必须是基类的指针或引⽤,因为只有基类的指针或引⽤才能既指向派⽣类对象;第⼆派生类必须对基类的虚函数重写/覆盖,重写或者覆盖了,派生类才能有不同的函数,多态的不同形态效果才能达到...基类的析构函数为虚函数,此时派⽣类析构函数只要定义,⽆论是否加virtual关键字,都与基类的析构函数构成重写,虽然基类与派⽣类析构函数名字不同看起来不符合重写的规则,实际上编译器对析构函数的名称做了特殊处理...但是要注意的这⾥继承下来的基类部分虚函数表指针和基类对象的虚函数表指针不是同⼀个,就像基类对象的成员和派生类对象中的基类对象成员也独立的。...派生类中重写的基类的虚函数,派⽣类的虚函数表中对应的虚函数就会被覆盖成派⽣类重写的虚函数地址。 派生类的虚函数表中包含,基类的虚函数地址,派生类重写的虚函数地址,派生类⾃⼰的虚函数地址三个部分。

    9410

    【C++】———— 继承

    答案当然是隐藏关系,因为函数重载针对的是同一个作用域的函数,而基类与派生类直接作用域不同。 在隐藏关系中,同名函数默认调用的当前作用域的函数,如果想调用其他作用域的函数,则需要使用域作用限定符。...四、派生类的默认成员函数 我们知道在类中有6个默认成员函数,如果不显示定义,编译会自动生成。那么如果在派生类中,这几个成员函数是如何生成的呢?...调用析构函数时会先调用派生类的析构函数,再调用基类的析构函数。 4.2:派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。..._num; } return *this; } 派生类赋值重载调用基类赋值重载时记得加域作用限定符,否则就会发生死循环。 五、继承中的友元与静态成员 5.1....继承一定程度破坏了基类的封装,基类的改变,对派生类有很大的影响。派生类和基类间的依赖关系很强,耦合度高。 8.2. has-a关系 组合是一种has - a的关系。

    8310

    【C++】C++多态世界:从基础到前沿

    那么在继承中要构成多态还有两个条件: 必须通过基类的指针或者引用调用虚函数 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写 1....即基类虚函数返回基类对象的指针或者引用,派生类虚函数返回派生类对象的指针或者引用时 析构函数的重写(基类与派生类析构函数的名字不同) 如果基类的析构函数为虚函数,此时派生类析构函数只要定义,无论是否加...virtual关键字,都与基类的析构函数构成重写,虽然基类与派生类析构函数名字不同,看起来违背了重写的规则,其实不然,这里可以理解为编译器对析构函数的名称做了特殊处理,编译后析构函数的名称统一处理成destructor...总结: 派生类的虚表生成: a.先将基类中的虚表内容拷贝一份到派生类虚表中 b.如果派生类重写了基类中某个虚函数,用派生类自己的虚函数覆盖虚表中基类的虚函数 c.派生类自己新增加的虚函数按其在派生类中的声明次序增加到派生类虚表的最后...虚函数覆盖:派生类中重写的虚函数会覆盖派生类对象虚表中的基类继承的函数指针,未重写的基类的虚函数依次存储在该派生类对象的虚表中,这样派生类对象的虚表中就同时存在基类与派生类的函数指针,在用基类对象指针或引用调用的时候通过

    11410

    C++多态

    如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数。运行期多态就是通过虚函数和虚函数表实现的。...如果派生类有自己的虚函数,那么虚表中就会添加该项。派生类的虚表中虚函数地址的排列顺序和基类的虚表中虚函数地址排列顺序相同。...虚函数的作用主要是实现了多态的机制,基类定义虚函数,子类可以重写该函数;在派生类中对基类定义的虚函数进行重写时,需要在派生类中声明该方法为虚方法,否则将会形成覆盖。...如果派生类重写了基类的虚方法,该派生类虚函数表将保存重写的虚函数的地址,而不是基类的虚函数地址。...如果基类中的虚方法没有在派生类中重写,那么派生类将继承基类中的虚方法,而且派生类中虚函数表将保存基类中未被重写的虚函数的地址。

    1.9K10

    【C++】多态详细讲解

    说明:要实现多态效果,第⼀必须是基类的指针或引⽤,因为只有基类的指针或引⽤才能既指向基类 对象⼜指向派⽣类对象;第⼆派⽣类必须对基类的虚函数完成重写/覆盖,重写或者覆盖了,基类和派 ⽣类之间才能有不同的函数...对实例进一步解释 1.为什么一定是基类的指针或引用?...在继承中我们说过派生类和基类的切片/切割问题,参数类型是基类可以保证实参传基类的对象也可以,传派生类的对象也可以。如果是派生类的指针或引用,基类对象根本传不过去。...2.3.5 析构函数的重写 基类的析构函数为虚函数,此时派⽣类析构函数只要定义,⽆论是否加virtual关键字,都与基类的析构函数构成重写,虽然基类与派⽣类析构函数名字不同看起来不符合重写的规则,实际上编译器对析构函数的名称做了特殊处理...派⽣类中 重写的基类的虚函数 ,派⽣类的虚函数表中对应的虚函数就会 被覆盖 成派⽣类重写的虚函数 地址 。

    8310

    【C++】多态

    第二派生类必须对基类的虚函数函数体进行重写/覆盖,重写或者覆盖了,对于同一个虚函数,派生类与基类有不同的函数体,多态的不同形态效果才能达到。 那么虚函数的重写/覆盖又是什么呢,有什么条件?...首先针对func函数,A与B中func有virtual修饰、参数列表(C++对缺省值不做规定)相同、返回值相同、派生类中的func对A中func的实现进行了重写,所以A、B中的func满足多态的基本条件...基类的析构函数如果是虚函数,此时派生类析构函数只要定义,无论是否加virtual关键字,都与基类的析构函数构成重写,虽然基类与派生类析构函数名字不同看起来不符合重写的规则,实际上编译器对析构函数的名称做了特殊处理...• 派生类的虚函数表中包含,基类的虚函数地址,派生类重写的虚函数地址,派生类自己的虚函数地址三个部分。...•需要注意的是虽然虚函数表相互独立,但是如果派生类没有重写基类的虚函数,那么派生类的虚函数表中存储的继承自基类的虚函数的地址还是原基类虚函数的地址;如果派生类中重写了基类的虚函数,派生类的虚函数表中存储的对应基类虚函数地址就会被覆盖成派生类重写的虚函数地址

    8910

    C Sharp(四)

    继承 ---- 通过继承我们可以定义新的派生类(derived class),来对基类(base class)进行扩展。...在派生类屏蔽基类成员的要点如下: 要屏蔽一个数据成员,需要声明一个新的相同类型的同名成员 要屏蔽一个函数成员,需要在派生类中声明带有相同签名的函数成员 要然编译器知道我们故意屏蔽基类成员,需要使用 new...如果要在派生类中需要访问被屏蔽的成员,可以使用基类访问表达式来访问隐藏的成员。...构造函数的执行 派生类对象有一部分就是基类对象: 要创建对象的基类部分,需要隐式的调用基类的某个构造函数作为实例创建的一部分 每个类在执行自己的构造函数之前要执行基类的构造函数 默认情况,构造对象时,...将调用基类的无参构造函数,如果希望派生类调用的是有参构造的话,就需要构造函数初始化语句。

    64020
    领券