Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >派生类中的成员不可用的C++保护的ctor

派生类中的成员不可用的C++保护的ctor
EN

Stack Overflow用户
提问于 2015-07-07 04:11:42
回答 3查看 118关注 0票数 1

如果我声明一个派生类(它还包括一个基本类型的附加成员),则会得到一个"constructor is protected"错误。

test.cpp:

代码语言:javascript
运行
AI代码解释
复制
class Base { protected: Base() {} };

class Derived1 : public Base
  {
    Derived1()  {}
  };

class Derived2 : public Base
  {
    Derived2()  {}
    Base    other_base;
  };

$ g++ test.cpp

代码语言:javascript
运行
AI代码解释
复制
test.cpp: In constructor ‘Derived2::Derived2():
test.cpp:3:25: error: ‘Base::Base()’ is protected
 class Base { protected: Base() {} };
                         ^
test.cpp:12:14: error: within this context
  Derived2()  {}

如果我声明Derived2是Base的朋友,错误就会消失。有人能解释一下这里发生了什么吗?

蒂娅。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-07 04:18:25

问题是Derived2包含Base的一个实例。

受保护成员的可访问性仅在访问其继承的成员的派生类实例的上下文中。它不允许构造具有受保护构造函数的成员。

因此,Derived2的构造函数不能构造other_base,而是可以构造它继承的Base

Derived2声明为friend of Base允许构造other_base

票数 3
EN

Stack Overflow用户

发布于 2015-07-07 04:15:58

这是因为other_base实际上不是Derived2类的一部分,它是一个单独的对象,它遵循公共/受保护/私有成员的正常规则。

票数 7
EN

Stack Overflow用户

发布于 2015-07-07 04:47:04

在您的示例中,other_base被视为您的Derived2类的成员,并且它遵循正常的访问规则。唯一可以调用受保护的Base() ctor的地方是Derived2 ctor的initzialization列表:

Derived2():Base() {}

如果要使用受保护/私有方法/成员,请使用friend关键字。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31268243

复制
相关文章
C++中派生类成员的访问属性
在派生类中,对基类的继承方式可以有public(公用的)、private (私有的)和protected(保护的)3种。 不同的继承方式决定了基类成员在派生类中的访问属性。 简单地说: (1)  公用继承(public inheritance) 基类的公用成员和保护成员在派生类中保持原有访问属性,其私有成员仍为基类私有。 (2)  私有继承(private inheritance) 基类的公用成员和保护成员在派生类中成了私有成员。其私有成员仍为基类私有。 (3)  受保护的继承(protected inheritance) 基类的公用成员和保护成员在派生类中成了保护成员,其私有成员仍为基类私有。 保护成员的意思是:  不能被外界引用,但可以被派生类的成员引用。
卡尔曼和玻尔兹曼谁曼
2019/01/25
1.1K0
C++中派生类对基类成员的访问形式
C++中派生类对基类成员的访问形式主要有以下两种: 1、内部访问:由派生类中新增成员对基类继承来的成员的访问。 2、对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问。今天给大家介绍在3中继承方式下,派生类对基类成员的访问规则。 1、私有继承的访问规则 当类的继承方式为私有继承时,基类的public成员和protected成员被继承后成为派生类的private成员,派生类的其它成员可以直接访问它们,但是在类的外部通过派生类的对象无法访问。基类的private成员在私有派生类中是不可直接访问的
猿人谷
2018/01/17
2.5K0
c++中的静态成员
静态成员变量特点: 1.所有对象共享一份数据 2.在编译阶段分配内存(程序还没运行前就分配内存) 3.类内声明,类外初始化(不初始化,无法使用)
大忽悠爱学习
2021/02/22
7480
c++中的静态成员
C++中的const成员变量和成员函数
在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定。const 可以用来修饰成员变量和成员函数。
芯动大师
2023/10/14
4050
C++中的const成员变量和成员函数
Python使用元类约束派生类中必须实现指定的成员
创建派生类时指定元类,用来控制和约束派生类的创建过程,对派生类中的成员进行一定的限制。
Python小屋屋主
2021/12/29
1K0
Python使用元类约束派生类中必须实现指定的成员
如何未受保护的成员变量
if w.last < time.Now().Add(-10*time.Second).UnixNano() {
用户7365393
2021/10/06
6710
C++类的成员函数 | 成员函数
在C++中,类的成员函数是函数的一种,它有返回值和函数类型,它与一般函数的区别只是:
小林C语言
2021/01/18
2K0
C++类的成员函数 | 成员函数
C++对象成员的引用 | 对象成员引用
C++不仅可以在类外引用对象的公用数据成员,还可以调用对象的公用成员函数,但同样必须指出对象名,应该注意所访问的成员是公用的还是私有的,只能访问public成员,而不能访问 private成员。
小林C语言
2021/01/21
2.2K0
C++对象成员的引用 | 对象成员引用
C++:30 ---C++类成员,成员函数的内存布局
这里要指出的是大家可以看到静态成员函数和静态成员变量sx的地址都是0x00007FF开头的,实际上他们都在全局数据区域存储(全局变量,静态变量),如果你有耐心,可以断点查看下栈空间内的局部变量i的地址:
用户3479834
2021/02/03
1.3K0
C++:30 ---C++类成员,成员函数的内存布局
【C++】C++类的静态成员
比如我们现在要设计一款战争游戏,在这款游戏中,分为多个兵种,每个兵种都有一定数量的士兵,游戏过程中,每隔一定时间每个兵种都会产生一定数量的士兵,由于战争的消耗,每个兵种的士兵都会减少。 为了使情节更逼真,引入了士气这个概念,当士气比较高的时候,这个兵种的战斗力就比较强,士气低的时候,这个兵种的战斗力就比较弱。 士兵的士气受很多因素影响,其中一个最直接的因素就是和这个兵种的数量直接相关,当这个兵种的士兵比较多,这个兵种的士气就比较高,战斗力就比较强。如果说当前的兵种士兵比较少,那么士气就比较弱,战斗力也比较弱。
谙忆
2021/01/21
5880
C++ 类的静态成员
我们可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。 静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为零。我们不能把静态成员的初始化放置在类的定义中,但是可以在类的外部通过使用范围解析运算符 :: 来重新声明静态变量从而对它进行初始化,如下面的实例所示。
用户7272142
2023/10/19
2930
【C++】C++ 类中的 this 指针用法 ② ( 常量成员函数 | const 修饰成员函数分析 )
在 C++ 类中 , 普通的非静态成员函数 , 可以使用 const 进行修饰 ,
韩曙亮
2023/10/15
2730
【C++】C++ 类中的 this 指针用法 ② ( 常量成员函数 | const 修饰成员函数分析 )
CA1047:不要在密封类型中声明受保护的成员
公共类型是 sealed(在 Visual basic 中为 NotInheritable),并声明了一个受保护的成员或受保护的嵌套类型。 此规则不报告 Finalize 方法的冲突,这些方法必须遵循此模式。
呆呆
2022/01/10
6500
C++中的static成员函数以及static成员变量详解「建议收藏」
static成员变量,在编程中我们时常都会遇到,那么你是否对static变量以及static成员函数有一定深入的认识呢?
全栈程序员站长
2022/07/11
8630
c++中类的数据成员初始化次序
分享一个之前学的知识点,感觉还挺重要的,就是当一个类中的某个数据成员同时拥有就地初始化、构造函数初始化列表和构造函数函数体里的赋值,那么它会先执行哪个?最后生效的又是哪个呢? 根据老师的讲解,数据成员的初始化次序依次为: 就地初始化 > 构造函数的初始化列表 >构造函数里的赋值(严格意义上不能成为初始化) 而当三种初始化方式都有时,构造函的函数体里的赋值肯定执行,并且生效,但是就地初始化和构造函数初始化列表的执行情况是怎样呢?写段代码测试一下
六月丶
2022/12/26
8870
C++中类成员函数作为多线程的入口
搜了一圈答案,基本上都是启动线程的时候传入this指针,在线程函数内部再强转的解决方案。可能显得有些别扭。
ApacheCN_飞龙
2019/02/15
2.8K0
C++:40---继承中类成员的变化关系
一、派生类继承基类成员的规则 ①派生类继承了基类的所有数据成员与函数(不论公有成员、保护成员、私有成员) ②派生类虽然继承了基类的所有成员,但是能不能访问基类的成员还与父类成员的属性(public、protected、private)以及继承方式有关 ③类静态成员:如果基类定义了一个静态成员,那么该静态成员在整个继承体系中都存在。 该静态成员只能定义一次,派生类不能再次定义 一个类改变了静态成员的值,整个继承体系中的值都将改变 #include <iostream> using namespace::std
用户3479834
2021/02/03
5670
C++:40---继承中类成员的变化关系
【C++】继承 ⑨ ( 继承中成员变量同名的处理方案 )
显然 , 父类 Parent 和 子类 Child 中 , 成员变量 b 发生了冲突 , 父类 和 子类 中各自定义了一个成员变量 b ;
韩曙亮
2023/10/25
4740
【C++】继承 ⑨ ( 继承中成员变量同名的处理方案 )
c++之类的成员变量和类的成员函数是分开存储的
全局数据区(data area),代码区(code area),栈区(stack area),堆区(heap area)(即自由存储区)。
西西嘛呦
2020/08/26
2K0
C++类的静态数据成员和静态成员函数
一些类对象可能会具有一些相同的属性,如果用普通数据成员来描述这些相同的属性,这意味着我们需要给每个对象的这个数据成员设定相同的值,如果改变类对象相同的属性,那么意味着我们需要对它们统一操作,这就有可能出现它们的值会不一样的情况,如果用全局变量来描述它们相同的属性,就会破坏类的独立性。
叶茂林
2023/07/30
2590

相似问题

在派生类C++中访问受保护成员

10

如何延迟C++基类中成员的初始化,直到执行派生类的ctor?

20

派生类中基类委托ctor的c++使用

10

访问派生类中类的受保护成员

24

C++:无法从派生类访问受保护成员

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档