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

6810

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

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

2.3K70

从零开始学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.3K10

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

66320

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

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

65540

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

38720

C++多态

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

1.7K10

C Sharp(四)

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

59920

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

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

31410

C++虚函数

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

1.1K30

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

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

40830

构造与析构时候...

构造/析构函数执行顺序 继承机制对象之间如何转换? C++成员访问权限和继承权限问题 如何禁止程序自动生成拷贝构造函数?...析构时候,如果有,且析构函数是虚函数,则先调用自己构造函数,再调用构造函数。 如果析构函数不是虚函数,则调用析构函数。 ---- 继承机制对象之间如何转换?...向下类型转换 将指针或引用转换为派生类指针或引用被称为向下类型转换,向下类型转换不会自动进行,因为一个对应几个派生类,所以向下类型转换时不知道对应哪个派生类,所以在向下类型转换时必须动态类型识别技术...三种继承方式 ① 若继承方式是public,成员在派生类访问权限保持不变,也就是说,成员访问权限,在派生类仍然保持原来访问权限; ② 若继承方式是private,所有成员在派生类访问权限都会变为私有...(private)权限; ③ 若继承方式是protected,共有成员和保护成员在派生类访问权限都会变为保护(protected)权限,私有成员在派生类访问权限仍然是私有(private)

62120

继承

实现多态公有继承方法: 在派生类重新定义方法。 使用虚方法(虚函数)。 3. 静态联编和动态联编 函数名联编:编译器将源代码函数调用解释为执行特定函数代码称为函数名联编。...动态联编主要包含一下方面: 成员函数必须声明为虚函数,即前面virtual。 如果某个成员函数声明了虚函数,则其派生类该成员函数不需要再声明。...虚函数表存储了为对象进行声明函数地址。通常情况下,对象包含一个指向该类函数指针。...如果重载函数被重新定义了,则应在派生类重新定义所有的版本。如果只重新定义一个版本,则另外几个重载版本将被隐藏,派生类无法使用他们。 4....抽象函数声明结尾处为=0,该虚函数称为纯虚函数。当声明包含纯虚函数时,则不能创建该类对象。 在虚函数原型中使用=0指出是一个抽象,在可以不定义该函数

68620

202452 学习笔记:继承基本概念

用继承创建对象可以调用父成员函数,但要注意,派生类继承了父成员函数和成员变量,不是拷贝了一份到派生类里,而是给了派生类去父调用父函数权利。...3.继承成员访问方式变化 不用死记硬背,而是要根据理解记忆方式去背下来。 可以看到,私有成员在子类都是不可见。...private成员在派生类无论以什么方式继承都是不可见。这里不可见是指私有成员还是被继承到了派生类对象,但是语法上限制派生类对象不管在里面还是外面 都不能去访问它。 2....在继承体系派生类都有独立作用域。 2. 子类和父中有同名成员,子类成员将屏蔽父同名成员直接访问,会优先访问自己成员,这种情况叫隐藏, 也叫重定义。...(在子类成员函数,可以使用 ::成员 显示访问) 3. 需要注意是如果是成员函数隐藏,只需要函数名相同就构成隐藏。 4. 注意在实际在继承体系里面最好不要定义同名成员。

10110

C++之多态

在继承种构成多态要满足两个条件: 必须通过指针或者引用调用虚函数(该指针或者引用操作派生类那一部分内容) 被调用函数必须是虚函数,且派生类必须函数进行重写。...析构函数: 如果析构函数定义为虚函数,则派生类析构函数无论是否virtual关键字都与析构函数构成重写,这里可以理解为编译器析构函数进行特殊处理将析构函数函数名统一处理为destuctor...总结一下派生类虚表形成: 函数直接进派生类虚表; 函数如果在派生类中被重写,就将重写后函数覆盖函数派生类自己函数,按照其在派生类声明顺序依次增加在虚表最后;...Func得到不同结果,这是因为调用函数传参对象,而派生类对象调用函数传参是派生类对象那一部分。...继承几个就有几张虚表,派生类自己函数直接放在第一个继承部分虚表

33440

C++基础多态(PolyMorphism)

函数派生类定义了于相同函数,使用指针指向派生类对象时,通过指针调用函数而不是派生类函数。...纯虚函数是在声明函数,它在没有定义,但要求任何派生类都要定义自己实现方法。...在实现纯虚函数方法是在函数原型后“=0” 纯虚函数声明如下: virtual 类型 函数名(参数列表)= 0; 抽象   一个包含纯虚拟函数称为抽象。 抽象是不能定义对象。...同时抽象只能作为来使用,其纯虚函数实现由派生类给出。如果派生类没有重新定义纯虚函数,而只是继承纯虚函数,则这个派生类仍然还是一个抽象。...如果派生类给出了纯虚函数实现,则该派生类就不再是抽象了,它是一个可以建立对象具体

46830
领券