首页
学习
活动
专区
工具
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、普通函数:   普通函数是静态编译,没有运行时多态,只会根据指针或引用“字面值”对象,调用自己普通函数。   普通函数是父为子类提供“强制实现”。   ...因此,在继承关系,子类不应该重写父普通函数,因为函数调用至于对象字面值有关。 参考链接

8410

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超链是默认原窗口打开,我想骂人

    67920

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

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

    66940

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

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

    9810

    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上,至于派生类对象创建是如何构造成员,我们看如下代码

    40420

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

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

    10510

    【C++】———— 继承

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

    7610

    C++多态

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

    1.8K10

    C Sharp(四)

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

    63020

    设计模式之二(简单工厂模式)

    前言   简单工厂模式根据提供数据或者参数返回几个可能一个实例,说通俗点有点像面向对象编程多态性,一个,有多个派生类,在另外调用程序,根据参数来决定返回这个哪个具体派生类,...返回值为类型,因为引用可以指向派生类对象,而且这些所有的派生类都包含有函数,也就是说派生类中有相同函数,但是函数实现可能不同。...简单工厂模式   假定A是一个,AB和AC都是派生于A派生类,XFactory根据提供给它参数来决定返回AB或者AC 哪一个,返回是哪个实例对于编程者来说并不是那么重要,因为这些有着相同方法...如何决定返回哪一个派生类,取决于工厂设计,该方法可以是非常复杂函数,也可以是简单函数。 接下来我们就通过简单加减乘除计算器来了解和实现简单工厂模式。...AB AC即、减、乘、除四个派生类

    33210

    设计模式之二(简单工厂模式)

    前言   简单工厂模式根据提供数据或者参数返回几个可能一个实例,说通俗点有点像面向对象编程多态性,一个,有多个派生类,在另外调用程序,根据参数来决定返回这个哪个具体派生类,...返回值为类型,因为引用可以指向派生类对象,而且这些所有的派生类都包含有函数,也就是说派生类中有相同函数,但是函数实现可能不同。...简单工厂模式   假定A是一个,AB和AC都是派生于A派生类,XFactory根据提供给它参数来决定返回AB或者AC 哪一个,返回是哪个实例对于编程者来说并不是那么重要,因为这些有着相同方法...如何决定返回哪一个派生类,取决于工厂设计,该方法可以是非常复杂函数,也可以是简单函数。 接下来我们就通过简单加减乘除计算器来了解和实现简单工厂模式。...AB AC即、减、乘、除四个派生类

    42230

    C++虚函数

    (2)在派生类重新定义此函数,要求函数名、函数类型、函数参数个数和类型全部与函数相同,并根据派生类需要重新定义函数体。    ...C++规定,当一个成员函数被声明为虚函数后,其派生类同名函数都自动成为虚函数。    ...因此在派生类重新声明该虚函数时,可以virtual,也可以不加,但习惯上一般在每一层声明该函数时都virtual,使程序更加清晰。    ...如果在派生类没有函数重新定义,派生类简单地继承其直接函数。 (3)定义一个指向对象指针变量,并使它指向同一需要调用该函数对象。...通过虚函数与指向对象指针变量配合使用,就能方便地调用同一同名函数,只要先用指针指向即可。     如果指针不断地指向同一不同类对象,就能不断地调用这些对象同名函数

    1.1K30

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

    指针或者引用可以通过强制类型转换赋值给派生类指针或者引用。但是必须是 指针是指向派生类对象时才是安全。 切片有赋值兼容,在赋值时候不会产生临时对象,就不需要const。...如下图,此时ref是直接指向派生类那一部分。 继承作用域 在继承体系派生类都有独立作用域。...(在子类成员函数,可以使用 ::成员 显示访问) 需要注意是如果是成员函数隐藏,只需要函数名相同就构成隐藏。 注意在实际在继承体系里面最好不要定义同名成员。...那么B和C如何去找到公共A呢?这里是通过了B和C两个指针,指向一张表。这两个指针叫虚表指针,A叫做虚,这两个表叫虚表。虚偏移量。通过偏移量可以找到下面的A。...继承一定程度破坏了封装,改变,派生类有很大影响。派生类依赖关系很强,耦合度高。 对象组合是继承之外另一种复用选择。新更复杂功能可以通过组装或组合对象来获得。

    14210

    剖析多态原理及实现

    动态多态原理 动态多态核心思想是定义了接口(虚函数),而派生类根据自己需求这些接口进行不同实现。在运行时,调用具体派生类实现,而不是实现。...虚函数重写与覆盖 重写(Override)是指派生类函数提供新实现。派生类函数必须和函数签名完全相同,即**返回类型、函数名、参数列表**必须一致。...调用时,根据参数类型选择相应print函数。 重写(Overriding) 重写是指在继承关系派生类函数重新实现。...定义:虚函数在声明时,末尾= 0,表明它是一个纯虚函数,无法在实现。 特点:纯虚函数只需要声明,不需要定义。...派生类虚表包含三地址: 函数地址:未被派生类重写函数。 重写函数地址:派生类函数重写。 派生类特有的虚函数地址:派生类定义独有虚函数

    13810
    领券