为什么受保护的构造函数会在这段代码中引发错误?

2023-12-03

关于受保护构造函数的一个问题。我了解到受保护的构造函数可以在派生类中使用。然而,我发现下面的代码有错误。为什么会出现这样的情况呢?

class A
{
    protected:
        A(){}
};

class B: public A {
    public:
        B() {
            A* f=new A();           // Why it is not working here
        }
};

这与具体的构造函数无关。就是这样protected访问工作。

The way protected访问说明符有效,它允许派生类B访问基类对象的内容A 仅当该类的对象A是类的子对象B。这意味着您在代码中唯一可以做的就是访问A through B: 您可以访问以下成员A通过类型指针B *(或类型的引用B &)。但是你cannot通过类型指针访问相同的成员A *(或参考A &).

考虑下面的例子

class A {
protected:
  int i;
};

class B : A  {
  void foo() {
    i = 0;        // OK
    this->i = 0;  // OK

    B *pb = this;
    pb->i = 0;    // OK

    A *pa = this;
    pa->i = 0;    // ERROR

    ((A *) this)->i = 0; // ERROR
  }
};

在上面的B::foo,您可以访问基础成员A::i通过使用简单的i句法。这相当于使用this->i句法。两者都可以工作,因为指针this有类型B *,即您正在访问A::i彻底的类型指针B *。这正是protected访问说明符应该允许。访问通过pb指针的工作原理完全相同。

然而,当你“转变”时this指向类型的指针A *,您无法再访问A::i通过这个新指针,即使您仍然尝试访问它们与以前相同的成员。

当应用于构造函数时,protected访问说明符具有非常具体的作用:受保护的构造函数只能用于初始化基类子对象。它不能用于初始化独立对象(这正是您想要做的)。换句话说,受保护的构造函数是实现概念的另一种方式抽象类在 C++ 中(以及纯虚方法)。如果类的构造函数受到保护,那么您的类实际上是受保护的abstract。您不能使用它来“从外部”定义独立的对象。 (当然,上述内容不适用于朋友内部以及班级本身)。

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

为什么受保护的构造函数会在这段代码中引发错误? 的相关文章

  • VLC 媒体播放器有 C# 界面吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否可以使用 C 控制台应用程序中的包装器从 VLC 播放中当前播放的文件中读取曲目统计信息 时间 标
  • C# 静态类型不能用作参数

    public static void SendEmail String from String To String Subject String HTML String AttachmentPath null String Attachme
  • C#.Net 邮件将进入垃圾邮件文件夹

    我正在从 ASP net Web 应用程序发送电子邮件 邮件发送成功 没有失败 但大多数都进入了垃圾邮件文件夹 请帮助我克服垃圾邮件过滤器 我的发送邮件代码 public void SendMail string FromAddress s
  • 捕获 .aspx 和 .ascx 页面中的异常

    问题说明了一切 请看以下示例代码 ul li li ul
  • 在 C 语言中,为什么数组的地址等于它的值?

    在下面的代码中 指针值和指针地址与预期不同 但数组值和地址则不然 怎么会这样 Output my array 0022FF00 my array 0022FF00 pointer to array 0022FF00 pointer to a
  • 无法继承形状

    为什么我不能使用继承 a 的类Shapes class http msdn microsoft com en us library ms604615 28v vs 90 29 我需要延长Rectangle具有一些方法的类 但我想以与使用相同
  • strlen() 编译时优化

    前几天我发现你可以找到编译时strlen使用这样的东西 template
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • 如何修复错误:“检测到无法访问的代码”

    我有以下代码 private string GetAnswer private int CountLeapYears DateTime startDate return count String answer GetAnswer Respo
  • if constexpr 中的 not-constexpr 变量 – clang 与 GCC

    struct A constexpr operator bool const return true int main auto f auto v if constexpr v A a f a clang 6 接受该代码 GCC 8 拒绝它
  • C# 根据当前日期传递日期时间值

    我正在尝试根据 sql server 中的两个日期获取记录 Select from table where CreatedDate between StartDate and EndDate我通过了5 12 2010 and 5 12 20
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o
  • 如何从 Boost.PropertyTree 复制子树

    我有一些boost property tree ptree 我需要树来删除一些具有特定标签名称的元素 例如 xml 表示源ptree如下
  • 以编程方式创建 Blob 存储容器

    我有一个要求 即在创建公司时 在我的 storageaccount 中创建关联的 blob 存储容器 并将容器名称设置为传入的字符串变量 我已尝试以下操作 public void AddCompanyStorage string subDo
  • Xamarin Forms Binding - 访问父属性

    我无法访问页面的 ViewModel 属性以便将其绑定到 IsVisible 属性 如果我不设置 BindingContext 我只能绑定它 有没有办法可以在设置 BindingContext 的同时访问页面的 viewmodel root
  • 调用 .ToArray() 时出现 ArgumentException

    我有一个经常被清除的列表 代码完全是这样的 VisitorAgent toPersist List
  • 如何高效计算连续数的数字积?

    我正在尝试计算数字序列中每个数字的数字乘积 例如 21 22 23 98 99 将会 2 4 6 72 81 为了降低复杂性 我只会考虑 连续的数字 http simple wikipedia org wiki Consecutive in
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助

随机推荐

  • 如何将整数编码为其他整数?

    作为后续将 2 个 4 位数字存储在 1 个 8 位数字中 我想知道是否有一个概括 您可以将 n 个 x 位数字存储到 m 个 y 位数字中 例如 也许您可 以将 5 个 8 位数字存储为 3 个 15 位数字 或者可能将 2 个 8 位数
  • 在OpenGL中绘制“点状”形状,与缩放无关

    我正在使用 Qt 和 QWt3D 绘图工具 并扩展它们以提供我需要的一些 3D 和 2D 绘图功能 因此我在此过程中学习了一些 OpenGL 我目前可以使用 OpenGL 绘制点 但只能绘制为圆形 或通过关闭抗锯齿功能绘制为 正方形 这些点
  • Java 不遵循代码? [复制]

    这个问题在这里已经有答案了 这是我认为不遵循代码应该执行的操作的代码片段 public void updateTimeElapsed timeElapsedLabel setText Time elapsed System nanoTime
  • 类成员的使用声明应为成员声明 (C++2003)

    第 7 3 3 段 C 2003 标准指出 类成员的使用声明应为成员声明 这意味着以下给出了语法错误 struct S1 static int var1 using S1 var1 虽然以下编译良好 namespace N2 int var
  • 警告:只有第一个字节会被分配给字符串偏移量

    以下代码在 PHP 7 中运行良好 为什么我在 PHP 8 中看到此警告 str xy str 0 bc 从 PHP 8 开始 尝试使用方数组括号样式替换具有多个字节的字符串偏移量将发出warning 所以你只需要删除多余的字节 c在这种情
  • Restlet - 使用路由器附加资源类时遇到问题

    使用 Restlet 2 1 0 Java SE 版本进行原型设计时 我在将 ServerResource 类映射到 url 时遇到问题 我已经使用 Router attach 方法尝试了很多变体 但没有任何效果 我当前的代码如下所示 pa
  • 按日期分组,当 count() 不产生任何行时为 0

    我正在使用 Postgresql 9 当没有计算行时 我正在与计数和分组作斗争 让我们假设以下架构 create table views date event timestamp with time zone event id intege
  • 如何在代码中进行检查以确保内核模块之间的依赖关系 - Linux Kernel?

    我有两个模块 我希望模块在执行 insmod 或 rmmod 时相互依赖 目前 我的 module2 依赖于 module1 如果我插入 module1 然后 module2 它工作正常 另一方面 反过来则行不通 这在解释上是合乎逻辑的 但
  • 检查 Python 中的字符串是否为“,”的精确形式

    我正在将两个整数组成的字符串转换为一个元组 我需要确保我的字符串的格式完全符合以下形式
  • CountDownTimer - 用户递增。问题

    我有一个关于 CountDownTimer 的问题 我必须制作一个应用程序 允许用户每次单击按钮时将时间时间增加 1 然后 在停止单击按钮后 它会等待三秒钟 然后开始倒计时 我在下面粘贴了我的代码 我的问题是 我似乎无法使数字递增正常工作
  • SWIFT:NSURLSession 将数据转换为字符串

    在我的 iPhone 应用程序 在 SWIFT 中开发 中 我必须与 https 服务 带有参数 进行通信 并且需要分析响应 一切正常 但在某些情况下注意到它没有得到预期的结果 进一步分析我发现这是将服务器响应数据转换为字符串的问题 NSD
  • 如何下载没有 nuget.exe 或 Visual Studio 扩展的 Nuget 包?

    如何下载 NuGet 包 我没有 NuGet Visual Studio 扩展或命令行程序 nuget exe 如何从网络下载 nupack 文件 据我了解 我将能够提取 dll从中获取文件 带有 7 zip 即可正常使用 我碰巧感兴趣的包
  • jQuery代码,看不懂

    我正在查看这段代码 由于我是网页设计的新手 我无法理解它 所以在我的索引页上我有一个谷歌的链接和ext js页面以下代码 这是我的理解 这是错误的 用户点击ok or cancel 因此变量c或者是ok or cancel 现在我不明白有什
  • 计算谷歌地图V3中两点之间的距离

    如何计算 Google 地图 V3 中两个标记之间的距离 类似于distanceFromV2 中的函数 Thanks 如果你想自己计算 那么你可以使用Haversine公式 var rad function x return x Math
  • PHP获取特定用户的数据

    现在我已经创建了一个带有会话的登录表单 我现在需要的是 当用户使用他的用户名和密码登录时 获取他的数据 例如姓名 关于等 并将其放在欢迎页面中 目前我已经创建了这段代码 但是这段代码获取了所有用户数据
  • 可变借用后的不可变引用

    每次使用 Rust 时 我都会遇到与所有权 借用相关的类似问题 因此这里是最简单的一段代码 它说明了我常见的问题 use std cell RefCell struct Res name String impl Res fn new nam
  • 使用 OpenCV 时输入图像错误中的通道数无效

    cv2 error OpenCV 4 2 0 c projects opencv python opencv modules imgproc src color simd helpers hpp 92 error 2 Unspecified
  • iPhone,如何在静音或静音模式下播放声音?

    作为主题 可能吗 Thanks 再次附上代码如下 请检查哪一步是错误的 谢谢 step AudioSessionInitialize NULL NULL NULL NULL AudioSessionSetActive true UInt32
  • PHP:从php文件中获取PHP的变量、函数、常量

    有没有办法从 php 文件中获取用户定义的 php 函数 变量 常量 以下功能不是最好的方法 因为它们全部被贴花 函数 变量 常量 包含数百个 php 内置常量和内部 php 函数 get defined vars get defined
  • 为什么受保护的构造函数会在这段代码中引发错误?

    关于受保护构造函数的一个问题 我了解到受保护的构造函数可以在派生类中使用 然而 我发现下面的代码有错误 为什么会出现这样的情况呢 class A protected A class B public A public B A f new A