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

如何从派生类到基类ptr访问受保护的基类函数

要从派生类到基类ptr访问受保护的基类函数,可以使用以下方法:

  1. 使用友元函数

在基类中声明一个友元函数,该函数可以访问基类的受保护成员。然后,在派生类中实现该友元函数,并使用基类的指针访问受保护成员。

代码语言:cpp
复制
class Base {
protected:
    int protected_member;

    friend void accessProtectedMember(Base* ptr);
};

class Derived : public Base {
public:
    void accessProtectedMember() {
        accessProtectedMember(this);
    }
};

void accessProtectedMember(Base* ptr) {
    ptr->protected_member = 42;
}
  1. 使用虚函数

在基类中声明一个虚函数,该函数可以访问基类的受保护成员。然后,在派生类中重写该虚函数,并使用基类的指针访问受保护成员。

代码语言:cpp
复制
class Base {
protected:
    int protected_member;

    virtual void accessProtectedMember() {
        protected_member = 42;
    }
};

class Derived : public Base {
public:
    void accessProtectedMember() override {
        Base::accessProtectedMember();
    }
};
  1. 使用访问函数

在基类中声明一个访问函数,该函数可以访问基类的受保护成员。然后,在派生类中继承该访问函数,并使用基类的指针访问受保护成员。

代码语言:cpp
复制
class Base {
protected:
    int protected_member;

    void accessProtectedMember() {
        protected_member = 42;
    }
};

class Derived : public Base {
public:
    using Base::accessProtectedMember;
};

在这些方法中,使用访问函数和虚函数可能更符合面向对象的设计原则,因为它们允许更好的封装和灵活性。

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

相关·内容

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

C++中派生类成员访问形式主要有以下两种: 1、内部访问:由派生类中新增成员对继承来成员访问。 2、对象访问:在派生类外部,通过派生类对象对继承来成员访问。...private成员在私有派生类中是不可直接访问,所以无论是派生类成员还是通过派生类对象,都无法直接访问继承来private成员,但是可以通过提供public成员函数间接访问。...当继承方式为公有继承时,public成员和protected成员被继承派生类中仍作为派生类public成员和protected成员,派生类其它成员可以直接访问它们。...private成员在私有派生类中是不可直接访问,所以无论是派生类成员还是派生类对象,都无法直接访问继承来private成员,但是可以通过提供public成员函数直接访问它们。... 当继承方式为保护继承时,public成员和protected成员被继承派生类中都作为派生类protected成员,派生类其它成员可以直接访问它们,但是外部使用者不能通过派生类对象访问它们

2.3K70

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

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

6910

从零开始学C++之继承(二):继承与构造函数派生类转换

输出可以看出: 派生类对象构造次序: 先调用对象成员构造函数,接着是构造函数,然后是派生类对象成员构造函数,最后是派生类自身构造函数。...初始化列表参数多个且其中有调用构造函数时,先执行构造函数最远开始,如果多重继承则按继承顺序);其他对象成员若不止一个,则按定义顺序构造,与初始化列表顺序无关。...四、派生类转换 当派生类以public方式继承时,编译器可自动执行转换(向上转型 upcasting 安全转换) 派生类对象指针自动转化为对象指针 派生类对象引用自动转化为对象引用... *>(pm2);     //e1 = m2;  // 私有或保护继承时候,派生类对象无法转化为对象。     ...; // 对象无法强制转化为派生类对象     return 0; } 五、派生类转换 对象指针(引用)可用强制类型转换为派生类对象指针(引用), 而对象无法执行这类转换.

1.5K00

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

,或保护和非虚拟 Should destruction behave virtually?...否则,应该对其进行保护,以便只有派生类才能在自己析构函数中调用它,这个析构函数也应该是非虚,因为它不需要虚拟地运行。...对于Base,调用代码可能会尝试通过指向Base指针销毁派生对象,例如在使用unique_ptr 时。...这种情况导致较早编码标准对所有析构函数都必须是虚拟提出了全面的要求。这太过分了(即使是常见情况);相反,规则应该是当且仅当析构函数是公共时,才将它们虚函数化。...更好设计是遵循该产品建议,为其提供保护非虚析构函数

1.1K20

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

首先初始化部分,然后按照声明顺序依次初始化派生类成员。 2.2 派生类使用成员 派生类可以直接访问公有成员和保护成员。...尽管语法上来说我们可以在派生类构造函数体内给它共有或保护成员赋值,但最好不要这么做。 2.3 继承与静态成员 如果定义了一个静态成员,则在整个继承体系中只存在该成员唯一定义。...保护成员 一个protected关键字声明它希望与派生类分享但是不想被其他公共访问使用成员: 和私有成员类似,保护成员对于用户来说不可访问 和公有成员类似,保护成员对派生类成员和友元来说是可访问...派生类成员或者友元只能通过派生类对象来访问保护成员,派生类对于一个对象中保护成员没有任何访问特权 理解最后一条规则可以参考如下例子: class Base { protected:...公有、私有和保护继承 某个对继承而来成员呢访问权限收到两个因素影响:一个是中该成员访问说明符,第二个是在派生类派生列表中访问说明符。

1.2K20

C++中继承

private成员在派生类中是不能被访问,如果成员不想在外直接被访问,但需要在派生类中能访问,就定义成protected。这里就可以明白了private和protected区别了吧。...并且注意_num用法是通过::成员 显示访问。...,编译器会变我们自动生成一个,那么在派生类 中,这几个成员函数如何生成呢?...派生类对象析构清理先调用派生类析构再调析构。 继承与友元 一句话:友元关系不能继承,也就是说友元不能访问子类私有和保护成员。..._stuNum << endl;//error 报错,因为派生类私有和保护成员不能被友元函数访问 } void main() { Person p; Student s; Display

94530

开发成长之路(6)-- C++入门开发(C++入门不难)

这已经是进入了第二个阶段了,此前如果C语言基础还没有打好小伙伴可以再补一下C语言: 开发成长之路(1)-- C语言入门开发(入门篇一) 开发成长之路(2)-- C语言入门开发(函数与定制输入输出控制函数...且看下去: class Base { public: // 公有成员,可以在外被随意访问 protected: // 保护成员,保护继承子类可以使用,自己和友元也可以使用...,不能被派生类访问;protected 成员可以被派生类访问。...cout << a2 << endl; //正确,protected成员,在派生类中仍是protected可以被派生类访问。...cout << a3 << endl; //错误,private成员不能被派生类访问

72020

【C++】继承

私有成员无论以任何方式被继承都无法被访问外,其他成员和继承方式都遵循最小权限原则,公有>保护>私有,在两种权限中找出最小权限,则成员访问限定符被继承子类后访问限定符为此最小权限。...实际运用中,公有继承最为常见,私有继承和保护继承并不常见,因为你继承目的就是想让子类能够访问某些成员,并且保护继承下来成员只能在派生类中进行使用,派生类外都无法访问公有成员函数,所以实际中扩展维护性不强...拷贝构造函数与构造不同,必须在派生类拷贝构造初始化列表处显示调用拷贝构造,完成成员复制。在传参时有人可能会有疑问,调用拷贝构造该如何将子类中成员提取出来呢?...父和某个函数友元关系不能继承子类上去,比如下面代码中Display是父Person友元函数,可以访问保护成员,但是继承子类后Display并不可以访问子类保护成员。...所以友元不能访问子类私有和保护成员。

65710

派生类多态虚函数

成员函数与继承派生类可以继承其成员, 然而有时候派生类必须对其重新定义。派生类需要对这些操作提供自己新定义以覆盖继承而来旧定义。...成员函数如果没被声明为虚函数,则其解析过程发生在编译时而非运行时。就会按照实际情况调用。 派生类可以继承定义在成员,但是派生类成员函数不一定有权访问继承而来成员。...我们用保护(protected)访问运算符说明这样成员。 派生类必须通过使用派生列表(clss erivatin list)明确指出它是哪个(哪些)继承而来。...现在,我们只需知道访问说明符作用是控制派生类继承而来成员是否对派生类用户可见。 如果一个派生是公有的,则公有成员也是派生类接口组成部分。...此外,我们能将公有派生类对象绑定引用或指针上。 大多数都只继承自一个,这种形式继承被称作“单继承”。 派生类函数派生类经常(但不总是)覆盖它继承函数

14720

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

protected:保护继承,派生类继承保护成员,这些成员在派生类中变为保护或私有的。...private:私有继承,派生类继承私有成员,这些成员在派生类中变为私有的,不能被外部访问。 C语言和C++区别 与C语言区别: C语言是面对过程,而C++是面对对象。...结构体比较,怎么判断两个对象是否相等 需要逐个比较它们成员变量(字段) 继承关系中子类能访问哪些成员变量以及成员函数 在继承关系中,子类(派生类)通常可以访问以下成员变量和成员函数...保护成员(protected):子类可以访问保护成员变量和函数。 私有成员(private):子类不能访问私有成员变量和函数。...构造函数和析构函数:如果构造函数和析构函数是公有的,子类可以直接访问它们;如果构造函数和析构函数保护或私有的,子类仍然可以访问它们,但只能在子类构造函数和析构函数内部调用它们,不能在外部使用

19210

C++ 继承与派生

公用继承 如果采用公用继承,访问属性在派生类中保持不变,即: 私有属性——派生类中私有属性 共用属性——派生类中共用属性 保护属性——派生类保护属性 class...(); 私有继承 如果采用私有继承,访问属性在派生类中发生如下变化,即: 私有属性——派生类中不可访问 共用属性——派生类中私有属性 保护属性——派生类中私有属性...但是有一点与私有成员不同:保护成员可以被派生类成员函数引用。...如果采用保护继承,访问属性在派生类中发生如下变化,即: 私有属性——派生类中不可访问 共用属性——派生类保护属性 保护属性——派生类保护属性 class...,函数保护就没有与外界接口了,在这里仅仅作为例子) 在这个例子中,派生类Student1中私有成员为: int age; 共有成员为: myshow1(); 保护成员为:

1.1K80

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

C++中函数就是用来解决这个问题。虚函数作用是允许在派生类中重新定义与类同名函数,并且可以通过指针或引用来访问派生类同名函数。 请分析例12.2。...(int, string,float); //声明构造函数 void display( );//声明输出函数 protected: //保护成员,派生类可以访问 int num;...对象指针变量ptr,然后使ptr指向gradl,再用ptr->display()调用。...这两种办法都不方便,它要求在调用不同派生类同名函数时采用不同调用方式,正如同前面所说那样,不同目的地要乘坐指定不同公交车,一一 对应,不能搞错。...但是,继承来某些成员函数不完全适应派生类需要,例如在例12.2中,display函数只输出数据,而派生类display函数需要输出派生类数据。

1.4K80

【干货】C++基础知识:继承与派生详解

, 在Rect中也是保护, 所以可以访问 // 而通过公有继承私有的成员, 在派生类中是不可被访问 void showRect() { cout << "x = "...在根<em>类</em>中,对于成员<em>的</em><em>访问</em>级别有三种:public、protected、private 在<em>派生类</em>中,对于成员<em>的</em><em>访问</em>级别有四种:public(公有)、protected(<em>受</em><em>保护</em>)、private(私有)、...<em>基</em><em>类</em><em>的</em>公有成员在<em>派生类</em>中仍然是公有的 <em>基</em><em>类</em><em>的</em><em>保护</em>成员在<em>派生类</em>中仍然是<em>受</em><em>保护</em><em>的</em> <em>基</em><em>类</em><em>的</em>不可<em>访问</em><em>的</em>成员在<em>派生类</em>中仍然是不可<em>访问</em><em>的</em> <em>基</em><em>类</em><em>的</em>私有成员在<em>派生类</em>中变成了不可<em>访问</em><em>的</em> 总结:在公有派生<em>的</em>情况下,通过<em>派生类</em>自己<em>的</em>成员<em>函数</em>可以<em>访问</em>继承过来<em>的</em>公有和<em>保护</em>成员...(3)私有派生 通过私有派生,<em>基</em><em>类</em><em>的</em>私有和不可<em>访问</em>成员在<em>派生类</em>中是不可<em>访问</em><em>的</em>,而公有和<em>保护</em>成员这里就成了<em>派生类</em><em>的</em>私有成员。...多重继承 01 一个<em>类</em><em>从</em>多个<em>基</em><em>类</em>派生 代码格式: class <em>派生类</em>名: <em>访问</em>控制 <em>基</em><em>类</em>名1, <em>访问</em>控制 <em>基</em><em>类</em>名2, … { //定义<em>派生类</em>自己<em>的</em>成员 } 像这样: // <em>基</em><em>类</em>A, 也叫根<em>类</em> class

81520

【C++】继承

,称做派生类/子类;继承呈现了面向对象程序设计层次结构,体现了由简单复杂认知过程;以前我们接触复用都是函数复用,继承是设计层次复用。...private成员 private成员 在派生类中不可见 在派生类中不可见 在派生类中不可见 表格内容可以概述为:私有成员在子类都不可见,其他成员在子类访问方式等于成员在访问权限与继承方式取较小值...派生类默认成员函数 派生类默认成员函数规则如下: 1、派生类构造函数必须调用构造函数初始化那一部分成员。...)子类析构会在被调用完成后自动调用父析构函数清理父成员,同时子类析构和父析构函数名都会被处理成 destructor,构成隐藏; ---- 五、继承与友元 友元关系不能继承,也就是说友元不能访问派生类私有成员和保护成员...,存放在静态区; 静态成员变量必须在外定义,定义时不添加 static 关键字,中只是声明; 静态成员变量访问域与访问限定符约束。

85400

两万字总结《C++ Primer》要点

如果把一个函数声明成虚函数,则该函数派生类中隐式也是虚函数。 (2)定义派生类 派生类必须通过派生类列表明确指出它是哪个继承而来。...派生类对象: 一个派生类对象包含多个部分:自己定义成员子对象,以及子对象。 派生类型转换: 由于派生类对象中含有与其对象组成部分,因此可以进行隐式执行派生类转换。...派生类构造函数: 每个控制自己成员初始化过程。派生类首先初始化部分,然后按照声明顺序依次初始化派生类成员。 派生类使用成员: 派生类可以访问公有成员和保护成员。...不能创建抽象对象。 15.5 访问控制与继承 保护成员: 派生类成员和友元只能访问派生类对象中部分保护成员;对于普通对象中成员不具有特殊访问权限。...P543 公有、私有和保护继承: 派生访问说明符对于派生类成员(及友元)能否访问其直接成员无影响; 对成员访问权限只与访问说明符有关。

1.5K30

两万字总结《C++ Primer》要点

如果把一个函数声明成虚函数,则该函数派生类中隐式也是虚函数。 (2)定义派生类 派生类必须通过派生类列表明确指出它是哪个继承而来。...派生类对象: 一个派生类对象包含多个部分:自己定义成员子对象,以及子对象。 派生类型转换: 由于派生类对象中含有与其对象组成部分,因此可以进行隐式执行派生类转换。...派生类构造函数: 每个控制自己成员初始化过程。派生类首先初始化部分,然后按照声明顺序依次初始化派生类成员。 派生类使用成员: 派生类可以访问公有成员和保护成员。...不能创建抽象对象。 15.5 访问控制与继承 保护成员: 派生类成员和友元只能访问派生类对象中部分保护成员;对于普通对象中成员不具有特殊访问权限。...P543 公有、私有和保护继承: 派生访问说明符对于派生类成员(及友元)能否访问其直接成员无影响; 对成员访问权限只与访问说明符有关。

1.7K20

第 15 章 面向对象程序设计

也正是因为在派生类对象中含有与其对应组成部分,所以能把派生类对象当成对象来使用,也因此能将指针或引用绑定派生类对象中部分上。这种转换也叫做派生类类型转换。...派生类应该遵循接口,通过调用构造函数来初始化那些中继承而来成员。派生类初始化过程大致为:初始化——>构造函数体——>派生类初始化——>派生类构造函数体。...---- 15.5 访问控制与继承 派生类成员和友元只能访问派生类对象中部分保护成员,对于普通对象中成员不具有特殊访问权限,即在派生类中也不能通过对象来访问 protected...假定 D继承自 B: 只有当 D公有地继承 B时,用户代码才能使用派生类类型转换;如果 D继承 B方式是保护或私有的,则用户代码不能使用该转换。...如果 D继承 B方式是公有或保护,则 D派生类成员和友元可使用 D向 B类型转换;反之,如果 D继承 B方式是私有的,则不能使用。 就像友元关系不能传递一样,友元关系同样也不能继承。

1K30

【C++修炼之路】15.C++继承

,继承s和t中Print结果是按照缺省值打印。...二、继承方式和访问限定符 三、继承成员访问方式变化 成员/继承方式 public继承 protected继承 private继承 public成员 派生类public成员 派生类protected...这里不可见是指私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在里面还是外面都不能去访问它。...private成员在派生类中是不能被访问,如果成员不想在外直接被访问,但需要在派生类中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现。...(即便成员函数会继承下来),那如何自己写出这几个默认成员函数呢?

52200

C++核心准则C.35:析构函数要么是公开函数,要么是保护非虚函数

为了避免无定义行为。如果析构函数是公有的,那么调用侧代码就会尝试使用指针销毁派生类对象,在析构函数为非虚函数时其结果时没有定义。...如果析构函数保护,那么调用侧代码就无法通过类型指针销毁派生类对象,这是析构函数就没有必要一定是虚函数。析构函数保护而不是私有的,这样派生类析构函数才能调用它。...虚函数定义了派生类接口,它可以在不关注派生类情况下使用。如果接口允许对象,那么这个销毁过程应该是安全。...我们可以想象一种需要保护函数析构函数情况:当希望允许派生类对象(只有这个类型)通过指针销毁另外一个对象(不是它自己)时。但是我们还没有在实际开发中遇到这种情况。...拥有虚函数函数要么是公开函数,要么是保护非虚函数。 译者注:拥有虚函数一般就意味着它有派生类

1K20

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

二、转换本质 派生类可以转换为本质是: ①为什么派生类可以转换为派生类而来,因此派生类中包含了方法和成员。...此时可以通过指针或引用指向派生类(相当于将派生类中继承那部分方法和成员绑定上了,相当于派生类被截断了),然后就可以将派生类假装是一个对象来使用(调用其中成员/方法) ②为什么不能转换为派生类...如果将一个对象绑定派生类指针/引用上,此时派生类通过指针/引用访问自己新定义成员/方法时,发现找不到(因此不能将转换为派生类) 例如:下面B继承于A,子类继承于父,同时为父成员开辟了空间...三、继承方式对类型转换影响 遵循下面3个规则: 假设B继承于A ①只有当B公有地继承A时,用户代码才能使用派生类转换;如果B是保护/私有的继承于A,则不能使用派生类转换 因为保护或者私有继承...B b; a = &b; //错误,因为为保护继承 return 0; } ③如果B继承于A方式是公有的或者保护,则B派生类成员和友元可以使用B向A类型转换;如果B继承于A方式是私有的,

1.6K10
领券