加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 错误:’A’是’B’无法访问的基础

发布时间:2020-12-16 10:03:52 所属栏目:百科 来源:网络整理
导读:我的代码如下 – #include iostream#include stringclass A{ int a; public: virtual void sayHello(){ std::cout "Hellon"; }};class B : private A{ std::string name; public: B(std::string _n): name(_n){} void sayName(){std::cout name "says hello
我的代码如下 –

#include <iostream>
#include <string>

class A{
    int a;
    public: virtual void sayHello(){ std::cout << "Hellon"; }
};

class B : private A{
    std::string name;
  public:
    B(std::string _n): name(_n){}
    void sayName(){std::cout << name << "says hellon";}
    void sayHello(){sayName();}
};


int main() {
    A *ptr = new B("c++");
    ptr->sayHello();
    return 0;
}

它产生以下编译器输出 –

Error:

06001

如前所述 – here,here& here,我知道如何解决这个问题.通过使用公共继承而不是私有或受保护.

但是,如果我真的想隐藏基类后面的一些接口,是不是还有其他方法可以做到这一点?或者根据规范说明不可能这样做.

解决方法

如果您希望多态指针转换在类外部工作,那么继承必须是公共的.没有办法解决这个问题.

您可以添加在类中执行多态指针转换的成员函数:

class B : private A{
    // ...
public:
    A* getA() {
        return this;
    }
};

这允许您执行此操作,同时仍允许私有继承:

B* b_ptr = new B("c++");
A* ptr   = b_ptr->getA();
// ptr   = b_ptr; // only allowed in member functions

我没有遇到真正的世界设计,这个技巧会有用,但适合自己.

PS.请记住,您应该销毁您创建的对象.还要认识到删除ptr具有未定义的行为,除非~A是虚拟的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读