Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当链接时,突然无法访问私有方法

当链接时,突然无法访问私有方法
EN

Stack Overflow用户
提问于 2014-02-04 02:21:27
回答 5查看 675关注 0票数 11

我有一个带有基类和派生类的简单类层次结构。基具有派生类调用的两个受保护的成员。根据最近的一些C#经验,我认为最好能使接口更加流畅,并允许方法调用的链接,这样this->B()就可以调用this->A()->B()而不是调用this->A()->B()。但是,以下代码将不会编译:

代码语言:javascript
运行
AI代码解释
复制
#include <iostream>

class Base
{
  protected:
    Base* A()
    {
      std::cout << "A called." << std::endl;    
      return this;
    }

    Base* B()
    {
      std::cout << "B called." << std::endl;    
      return this;
    }
};

class Derived : public Base
{
  public:
    void Test()
    {
        // Base::A and Base::B are private here.
        this->A()   // This works fine
            ->B();  // Suddenly I cannot access my own private method?
    }
};

int main()
{
    Derived d;
    d.Test();

    return 0;
}

这会产生以下编译器错误:

代码语言:javascript
运行
AI代码解释
复制
main.cpp: In member function 'void Derived::Test()':
main.cpp:12:15: error: 'Base* Base::B()' is protected
         Base* B()
               ^
main.cpp:26:21: error: within this context
                 ->B();  // Suddenly I cannot access my own private method?
                     ^

我还尝试将基类方法变成虚拟的,但这并没有帮助。

我的C++已经生锈了,我似乎不知道这里到底发生了什么,所以我会非常感激你的帮助。另外,我想知道这是不是个坏主意,因为C++ != C#和C++-人们不习惯这样流畅的界面。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-02-04 02:33:03

类中的受保护成员只能通过派生类(即通过派生类的对象、引用或指针)从派生类访问。

A()的返回类型是Base*,它不是派生类,这就是不能访问其受保护成员的原因。编译器不跟踪它是否真正引用了同一个对象。

票数 8
EN

Stack Overflow用户

发布于 2014-02-04 02:26:38

是的,不能从Base类的Base *中调用受保护的方法。您可以认为受保护的方法是私有的,不同的是它们也成为派生类的私有方法。

票数 2
EN

Stack Overflow用户

发布于 2014-02-04 02:34:06

这是正确的行为,您不能为不同的类调用受保护的函数,您只能通过派生类进行调用,因为当调用this->A()时,它返回一个Base*,这是一个不同的类。原因是,如果你做了类似的事情

代码语言:javascript
运行
AI代码解释
复制
class Derived : public Base
{
  public:
    void Test()
    {
       baseInstance->B(); // this shouldn't be possible. If the case was you can call it through a pointer or an object this would be possible.
    }

    Base* baseInstance; 
};

此外,还可以指出派生this和基可能没有相同的地址,可能有不同的地址。当您实际将Base*转换为Derived*时,编译器将处理地址上的差异,这使得它能够工作,这就是为什么它是像这样做的static_cast<Derived*>(this->A())->B();

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

https://stackoverflow.com/questions/21549681

复制
相关文章
【Python】面向对象 - 封装 ② ( 访问私有成员 | 对象无法访问私有变量 / 方法 | 类内部访问私有成员 )
在 类外部 创建的 Student 实例对象 , 是无法访问 __address 私有成员的 ;
韩曙亮
2023/10/11
3590
【Python】面向对象 - 封装 ② ( 访问私有成员 | 对象无法访问私有变量 / 方法 | 类内部访问私有成员 )
Qtcreator调试时变量“无法访问”
原文链接:https://blog.csdn.net/chyuanrufeng/article/details/86140033
acoolgiser
2019/08/14
1.9K0
Nginx修改WordPress固定链接导致无法访问
  这篇文章主要介绍了Nginx下修改WordPress固定链接导致无法访问的问题解决,同时作者也给出了官方关于修改固定链接的方法,需要的朋友可以参考下
会长君
2023/04/26
2.2K0
解决 Fedora 无法访问码云私有库问题
本文首发于:https://blog.frytea.com/archives/526/
宋天伦
2021/04/19
1.6K0
解决 Fedora 无法访问码云私有库问题
当程序员突然从世界上消失
  这一特殊群体的消失,不仅让IT行业瞬间崩塌,其它行业也受到了巨大的冲击:比如格子衫和冲锋衣厂家就立即表示受到了一万点伤害,因为他们的衣服再也卖不出去。   成吨的bug无人处理,系统后台无人维护,
用户1667431
2018/04/18
5770
当程序员突然从世界上消失
当AI泡沫破裂时……
很显然我们目前处于一个不稳定的状态。这到底是一场泡沫还是一次革命?答案是当然包含一点革命——深度神经架构所创造的实实在在的成功已经颠覆了视觉和语音识别领域,更通用的机器学习也已经有了大量真实世界用例。
机器之心
2018/07/26
3800
当AI泡沫破裂时……
很显然我们目前处于一个不稳定的状态。这到底是一场泡沫还是一次革命?答案是当然包含一点革命——深度神经架构所创造的实实在在的成功已经颠覆了视觉和语音识别领域,更通用的机器学习也已经有了大量真实世界用例。
刀刀老高
2018/07/24
3620
解决蓝奏云链接无法访问问题
方法一:修改蓝奏云链接域名 将www.lanzous 后面的 s 改为 x 或者改为 i ,www.lanzoux,然后再访问链接即可正常访问。 方法二:油候脚本自动转换蓝奏云链接 脚本地址:蓝奏云连接转换 这款脚本可以将蓝奏云网盘链接自动转换成 pan.lan zou.com,从而解决一部分蓝奏云用户无法打开蓝奏云网站的问题! 开启插件后,自动将网页链接转换成可访问的蓝奏云链接,省去了每次手动的操作。 注意:如果转换之后你仍然无法访问蓝奏云链接,这就有可能是你当地网络运营商的问题,这时我们就需要简答修改一
兮动人
2021/06/11
3.1K0
解决蓝奏云链接无法访问问题
Python 私有属性和私有方法
其中__secret这个私有方法只能在类中调用,所以外部对象实例想要获取私有方法或者私有属性,那么就需要定义一个公有的方法来传递数值。
Devops海洋的渔夫
2019/05/31
1.4K0
CentOS上部署node时,外网无法访问。
    最近在CentOS上部署node时,碰到了一个问题。明明用forever启动了node服务,并且配置好了nginx,但在外网始终无法访问到node服务。
拓荒者
2019/07/26
3.8K2
jsDelivr无法访问解决方法
https://github.com/jsdelivr/jsdelivr/issues/18348
大白熊
2021/12/23
5K0
jsDelivr无法访问解决方法
链接时无法解析符号checklist
主要原因包括四类:函数声明与实现的原型不一致、函数声明与实现的作用域不同、函数声明但没有实现、使用DLL接口不当。
gaigai
2019/08/30
2.5K0
当css属性width设为100%时
  平常在写页面html代码时,经常会使用到width:100%来使控件宽度为父控件的内容宽度。但如果父控件为body,而且没有明确设置body的宽度,那么就会出现以下的情况了。   代码: 1 <body> 2 <div style="background:#888;width:100%;height:200px"> 3 <div style="width:1000px;height:100px;margin:0 auto;border:solid 1px red"></div> 4 </di
^_^肥仔John
2018/01/18
1.4K0
当css属性width设为100%时
当删库时如何避免跑路
删库跑路也是个老梗了,可见在运维数据库的过程中误删除数据,或者开发的代码有bug,造成数据的误删除屡见不鲜。不过现在也有许多用于恢复或预防误删除的方案,例如SQL管理系统,将要执行的SQL先交由管理员审核,然后由管理员备份一个镜像数据库,在镜像上执行该SQL,并在执行后还原镜像。这样经过层层把关就可以大大减小出现误操作的几率。
端碗吹水
2020/09/23
1K0
当删库时如何避免跑路
VS编译链接时错误(Error Link2005)的解决方法
      近期参与的项目中使用了公司另外一个同事提供的一个静态库文件。该静态库文件集成了CUDA, OpenCL两个库,用于做图形加速计算,提高视频解码拼接速度。但是在编译链接项目时,VS爆出如下错误: 1>LIBCMTD.lib(crt0init.obj) : error LNK2005: __xi_a 已经在 MSVCRT.lib(cinitexe.obj) 中定义 1>LIBCMTD.lib(crt0init.obj) : error LNK2005: __xi_z 已经在 MSVCRT.lib(c
24K纯开源
2018/01/18
2.5K0
VS编译链接时错误(Error Link2005)的解决方法
当执行 DELETE 时,你心慌了
老实讲,俺也一样。不仅仅是执行 DELETE 心里会咯噔下,多几次确认,哪怕是 INSERT,UPDATE, 甚至是 SELECT, 只要是在生产环境做的操作,都难免心里会有些紧张。
Lenis
2021/10/11
3330
当hahaAI超过小程序内存时!
今年年底,我将发布与我的书相关的所有应用,包括微信小程序、个人网站以及谷歌浏览器扩展程序。
石璞东
2021/10/13
4690
当测试发现300个缺陷时
当测试人员发现了这么多问题后,是否还隐藏着更多的未知问题?当测试人员疲于提交大量的缺陷时,测试执行的有效性是否降低了?还有哪些风险项存在?
CKL的思考
2023/08/28
2180
当测试发现300个缺陷时
Python中私有变量和私有方法芳
Python中要想定义的方法或者变量只能在类内部使用不被外部使用,可以在方法和变量前面加两个下划线,让其变为私有方法或私有变量。类外部可以通过 ”_类名__私有属性(方法)名“ 访问私有属性(方法)。
王大力测试进阶之路
2022/06/07
1.4K0
当 snapshot 失败时发生了什么
工作中遇到了与 snapshot 异常相关的问题,特此总结一下,与 snapshot 相关的流程图如下:
shengjk1
2020/10/16
1K0
当 snapshot 失败时发生了什么

相似问题

当扩展SurfaceView时,无法访问getChildCount()方法?

11

创建哈希链接方法时无法访问头指针

21

当链接服务器无法访问时设置标志,oracle

11

当改变活动时程序突然结束

134

android私有属性突然变为空

123
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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