从子类访问私有继承类的名称

2024-03-19

以下代码无法编译,g++ 会出现此错误,clang 也会出现类似错误。

main.cpp:16:19: error: 'QByteArray' is a private member of 'QByteArray'
        Container2(const QByteArray &ba);
                         ^
main.cpp:3:18: note: constrained by private inheritance here
class Container1:private QByteArray
                 ^~~~~~~~~~~~~~~~~~
../edge-clang/qt5/include/QtCore/qbytearray.h:167:21: note: member is declared here
class Q_CORE_EXPORT QByteArray
                    ^
main.cpp:18:30: error: 'QByteArray' is a private member of 'QByteArray'
Container2::Container2(const QByteArray &ba):Container1(ba){}
                             ^
main.cpp:3:18: note: constrained by private inheritance here
class Container1:private QByteArray
                 ^~~~~~~~~~~~~~~~~~
../edge-clang/qt5/include/QtCore/qbytearray.h:167:21: note: member is declared here
class Q_CORE_EXPORT QByteArray
                    ^

我不明白为什么不允许 Container2 继承 Container1 并通过公共构造函数初始化它,即使 QByteArray 的继承是私有的。

#include <QByteArray>

class Container1:private QByteArray
{
public: 
    Container1() {}
    Container1(const QByteArray &ba);
};

Container1::Container1(const QByteArray &ba):QByteArray(ba){}

class Container2:public Container1
{
public:
    Container2() {}
    Container2(const QByteArray &ba);
};
Container2::Container2(const QByteArray &ba):Container1(ba){}

int main(int argc,char *argv[])
{
    QByteArray ba;
    Container1 c1(ba);
    Container2 c2(ba);
}

这是一个很大的错误!

在这样的背景下C, "A” 的意思是“注入类名 A我从我的基地得到的”。
你可以把它想象成C::B::A.
当然,由于私有继承,该基数是不可访问的:

class A {};

class B : private A {
public:
   B() {}
   B(const A&) {}  
};

class C : public B {
public:
   C(const A&) {}
};

int main()
{
   A a;
   B b(a);
   C c(a);
}

// main.cpp:11:13: error: 'class A A::A' is inaccessible within this context
//      C(const A&) {}
//              ^
// main.cpp:1:9: note: declared here
//  class A {};
//        ^

(现场演示 http://coliru.stacked-crooked.com/a/f6687cab8caa05f2)

您可以通过调用它来解决这个问题::A,采取更间接的途径来实际命名完全相同的类型:

class A {};

class B : private A {
public:
   B() {}
   B(const A&) {}  
};

class C : public B {
public:
   C(const ::A&) {}
};

int main()
{
   A a;
   B b(a);
   C c(a);
}

// OK

(现场演示 http://coliru.stacked-crooked.com/a/46b1fd5014667c20)


顺便说一句,完全相同的逻辑适用于privately继承的成员变量:

int x = 1;

class A
{
private:
   int x = 2;
};

class B : A {
public:
   B() { int y = x; }
};

int main()
{
   A a;
   B b(a);
}

// main.cpp: In constructor 'B::B()':
// main.cpp:11:17: error: 'int A::x' is private within this context
//    B() { int y = x; }

(现场演示 http://coliru.stacked-crooked.com/a/5c2e3a74932bc1d2)

从表面上看,这一切确实看起来很愚蠢,但可能有一个很好的理由。


对于你的情况,那么:

Container2(const ::QByteArray &ba);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从子类访问私有继承类的名称 的相关文章

  • 为什么libc++的shared_ptr实现使用完整内存屏障而不是宽松内存屏障?

    在boost的实现中shared ptr 它用放松内存排序以增加其引用计数 https github com boostorg smart ptr blob master include boost smart ptr detail sp
  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • 为什么大多数 C 开发人员使用 Define 而不是 const? [复制]

    这个问题在这里已经有答案了 在许多程序中 define与常量具有相同的用途 例如 define FIELD WIDTH 10 const int fieldWidth 10 我通常认为第一种形式优于另一种形式 它依赖于预处理器来处理基本上是
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • 使用post方法将多个参数发送到asp.net core 3 mvc操作

    使用 http post 方法向 asp net mvc core 3 操作发送具有多个参数的 ajax 请求时存在问题 参数不绑定 在 dot net 框架 asp net web api 中存在类似的限制 但在 asp net mvc
  • 从 MVC 迁移到 ASP.NET Core 3.1 中的端点路由时,具有角色的 AuthorizeAttribute 不起作用

    我正在尝试将我的项目从 UseMVC asp net core 2 2 兼容样式 升级到 UseEndpoint Routing 并且我的所有请求都被重定向到我的验证失败页面 它与声明有关 如果我删除 Authorize Roles Adm
  • 如何使用recv()检测客户端是否仍然连接(并且没有挂起)?

    我写了一个多客户端服务器程序C on SuSE Linux 企业服务器 12 3 x86 64 我为每个客户端使用一个线程来接收数据 我的问题是 我使用一个终端来运行服务器 并使用其他几个终端来运行服务器telnet到我的服务器 作为客户端
  • POCO HTTPSClientSession 发送请求时遇到问题 - 证书验证失败

    我正在尝试使用 POCO 库编写一个向服务器发出 HTTPS 请求的程序 出于测试目的 我正在连接到具有自签名证书的服务器 并且我希望允许客户端进行连接 为了允许这种情况发生 我尝试安装InvalidCertificateHandler这是
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • ASP MVC:服务应该返回 IQueryable 的吗?

    你怎么认为 你的 DAO 应该返回一个 IQueryable 以便在你的控制器中使用它吗 不 您的控制器根本不应该处理任何复杂的逻辑 保持苗条身材 模型 而不是 DAO 应该将控制器返回给视图所需的所有内容 我认为在控制器类中看到查询 甚至
  • 如何识别 WPF 文本框中的 ValidationError 工具提示位置

    我添加了一个箭头来指示工具提示中的文本框 当文本框远离屏幕边缘时 这非常有效 但是当它靠近屏幕边缘时 工具提示位置发生变化 箭头显示在左侧 Here is the Image Correct as expected since TextBo
  • C 语言中 =+(等于加)是什么意思?

    我碰到 与标准相反 今天在一些 C 代码中 我不太确定这里发生了什么 我在文档中也找不到它 In ancientC 版本 相当于 它的残余物与最早的恐龙骨头一起被发现 例如 B 引入了广义赋值运算符 使用x y to add y to x
  • 如何重置捕获像素的值

    我正在尝试创建一个 C 函数 该函数返回屏幕截图位图中每四个像素的 R G 和 B 值 这是我的代码的一部分 for int ix 4 ix lt 1366 ix ix 4 x x 4 for int iy 3 iy lt 768 iy i
  • 如何在c#中的内部类中访问外部类的变量[重复]

    这个问题在这里已经有答案了 我有两个类 我需要声明两个类共有的变量 如果是嵌套类 我需要访问内部类中的外部类变量 请给我一个更好的方法来在 C 中做到这一点 示例代码 Class A int a Class B Need to access
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • 将代码拆分为标头/源文件

    我从 Asio 的示例页面中获取了以下代码 class tcp connection public boost enable shared from this
  • 是否可以有一个 out ParameterExpression?

    我想定义一个 Lambda 表达式out范围 有可能做到吗 下面是我尝试过的 C Net 4 0 控制台应用程序的代码片段 正如您在 procedure25 中看到的 我可以使用 lambda 表达式来定义具有输出参数的委托 但是 当我想使
  • 转到定义:“无法导航到插入符号下的符号。”

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我今天突然开始在我的项目中遇到一个问题 单击 转到定义 会出现一个奇怪的错误 无法导航到
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检

随机推荐

  • 表格太宽,无法容纳 Markdown 生成的 PDF

    我正在尝试使用 Rmarkdown 将 SQL 查询的表显示为 pdf 但是 我得到的表格太宽 不适合文档 有人建议我使用 Pander 包 因此我尝试使用 pandoc table 函数 该函数在控制台上运行良好 但由于某种原因 它阻止我
  • 一组玩家的所有可能的牌/扑克牌组合

    我正在寻找一个优雅 快速 的 python 函数 它可以从以下两个数组中生成每个组合 cards 8H 8S 8C 8D 9H 9S 9C 9D 10H 10S 10C 10D AH AS AC AD players 1 1 1 2 2 2
  • 你用 Sinatra 做什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Java 文档重写方法不具有 InheritDoc

    重写另一个方法的方法不会继承它所重写的方法的文档 有没有办法明确告诉它继承文档 inheritDoc This implementation uses a dynamic programming approach Override publ
  • HttpClient 属性未通过 DI 传递

    我正在开发一个 ASP NET Core 5 0 项目 该项目有一个访问 API 的服务 根据下面的代码 我希望提供给 ToornamentService 构造函数的 HttpClient 包含声明的 BaseAddress 和 API 密
  • 为什么 WiX 安装会在 HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\ 中创建两个条目

    我正在尝试卸载我们产品的旧版本 该版本是使用 WiX 构建的安装程序安装的 并且在静默卸载后 msiexec x GUID 该程序仍然出现在控制面板中 我已经开了一个单独的项目 https stackoverflow com questio
  • 强制 Vagrant 在下一个 vagrant up 时重新配置或下载新的盒子

    如果我更改配置脚本或更糟糕的是基本操作系统 有没有办法强制 vagrant 重新配置或重新下载基本框 我试图改变config vm box and config vm box url but vagrant up仍然高兴地启动到旧盒子 我知
  • Blowfish 和 Blowfish-compat 有什么区别?

    我似乎找不到差异的来源 我在这个在线解密工具中发现了这个区别 http www tools4noobs com online tools decrypt http www tools4noobs com online tools decry
  • Yargs 帮助不显示所有帮助选项

    我在用yargs为传递给脚本的参数添加命令行选项 当我发出帮助命令以及脚本名称时 它不会显示以下内容的帮助add范围 const yargs require yargs const argv yargs command add ADD A
  • 如何在nodejs中使用sweetalert?

    我有一个带有html代码的nodejs代码 我想在处理nodejs中的函数之后在客户端显示一个甜蜜的警报 var express require express var router express Router const Swal re
  • 度分秒 (DMS) 正则表达式

    我有一个正则表达式 我想以各种方式匹配纬度 经度对 例如 123 34 42 123 34 42 123 34 42 123 34 42 45 12 22 N 45 12 22 S 90 00 00 0N 我希望能够将它们配对 这样 90
  • 为什么当您在 package.json 中设置 "private": true 时,“无许可证字段”警告消失

    我有一个反应应用程序 通过安装其依赖项yarn install 当我运行此命令时 我得到以下信息No license field相关警告 warning package json No license field warning email
  • 如何对熔化的数据帧进行零归一化?

    假设我有这个熔化的 data frame molten lt data frame gene c a1 b1 a1 b1 a1 b1 count c 3 4 5 2 6 7 condition c A A B B C C gene coun
  • PHP 框架与内容管理系统

    您如何向精通技术 主要精通硬件 网络 但很少或根本不编程 的人解释 PHP 框架和 CMS 例如 Wordpress 之间的区别 作为一名业余到中级程序员 我可以尝试回答这些问题 但我更重视那些对框架和 CMS 更有经验的人的意见 您可以查
  • 如何在 NSMenu 中放置水平滑块(Swift 3,Xcode 8)

    从 macOS Sierra 开始 音量菜单栏项目提供了一个水平滑块项目来更改系统的音量 我想在我自己的应用程序中采用这个概念 并提出了以下课程 import Cocoa NSApplicationMain class AppDelegat
  • XSLT:如果满足条件,如何退出“for-each”循环

    如果满足条件 如何退出 XSL 中的 for each 循环 例如假设我希望 XSL 显示具有 2 间卧室且租金
  • iPhone 开发:处理大量数据时 Core-Plot 性能缓慢

    iPhone 开发 处理大量数据时 Core Plot 性能缓慢 我尝试将 500 个数据放入绘图中 性能表明它确实很慢 大多数烛台图都混合在一起 请问有人可以帮我解决吗 注意绘图区域的大小 如果数据点多于像素 请按照 benzado 建议
  • 软件测试 pdf 是否正确创建[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我用 Laravel 编写了一个 REST 应用程序 它接受 Json 有效负载并使用该数据创建格式化的 pdf 是否可以编写一个测试
  • 实体框架与 AssociateWith

    当我使用 Linq2Sql 时 我可以通过在 DataLoadOptions AssociateWith 方法中使用 lambda 表达式来过滤表 我用它来过滤所使用的语言 所以我有一个包含所有语言的语言表和一个包含对象的对象表 Like
  • 从子类访问私有继承类的名称

    以下代码无法编译 g 会出现此错误 clang 也会出现类似错误 main cpp 16 19 error QByteArray is a private member of QByteArray Container2 const QByt