首页
学习
活动
专区
工具
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.4K70

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

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

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

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

    1.5K00

    穿越Java世界的继承奇旅:从基类到子类的华丽蜕变

    二:什么是继承以及继承的方式 继承是面向对象编程(OOP)中的一个核心概念,它提供了一种机制,允许我们基于已有的类来创建新的类,新创建的类被称为子类(或派生类),而原有的类被称为父类(或基类、超类)。...Dog和Cat都继承了Animal类,其中:Animal类称为父类/基类或超类,Dog和Cat可以称为Animal的 子类/派生类,继承之后,子类可以复用父类中成员,子类在实现时只需关心自己新增加的成员即可...class 基类名 { // 基类的成员变量和成员函数 } class 派生类名 extends 基类名 { // 派生类的成员变量和成员函数 } 四:父类成员的访问...关键字 // super是获取到子类对象中从基类继承下来的部分 super.a = 200; super.b = 201; // 父类和子类中构成重载的方法,直接可以通过参数列表区分清访问父类还是子类方法...Benz extend Car{ // 将汽车中包含的:轮胎、发送机、车载系统全部继承下来 } 注意: 1.继承是一种“is-a”关系,即派生类是基类的一个特殊化版本。

    8510

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

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

    1.1K20

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

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

    1.2K20

    【C++】继承

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

    71010

    基类派生类多态虚函数?

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

    19520

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

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

    30810

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

    1.1K20

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

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

    2.1K30

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

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

    1.8K20

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

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

    1.1K20

    第 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。可以看出保护成员限定符是因继承才出现的。...(即便基类的成员函数会继承下来),那如何自己写出这几个默认成员函数呢?

    55700

    【C++】模板继承多态

    在继承结构中,派生类从基类可以继承过来private的成员,但是派生类却无法直接访问。 protected和private的区别?...在基类中·定义的成员,想被派生类访问,但是不想被外界访问,那么在基类中,把相关成员定义成protected保护的,如果派生类和外部都不打算访问,那么在基类中,就把相关成员定义成private私有的 默认继承方式...通过调用·基类相应的构造函数来初始化 派生类的构造函数和析构函数,负责初始化和清理派生类部分 派生类从基类继承来的成员的初始化和清理谁来负责?...是由基类的构造和析构来负责 派生类对象构造和析构的过程是: 派生类调用基类的构造函数,初始化从基类继承来的成员。 调用派生类自己的构造函数。...把继承结构,也就是说成从上(基类)到下(派生类)的结构 基类对象 派生类对象 类型从下到上的转换(可以) 派生类对象 基类对象 类型从上到下的转换(不可以) 基类指针(引用)派生类对象

    10510
    领券