gpt4 book ai didi

c++ - 错误 : 'A' is an inaccessible base of 'B'

转载 作者:太空狗 更新时间:2023-10-29 20:02:34 27 4
gpt4 key购买 nike

我有一个代码如下-

#include <iostream>
#include <string>

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

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


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

产生以下编译器输出 -

Error:

prog.cpp: In function 'int main()':
prog.cpp:20:22: error: 'A' is an inaccessible base of 'B'
A *ptr = new B("c++");
^

如前所述 - here , here & here ,我知道如何解决这个问题。通过使用 public 继承而不是 privateprotected

但是如果我真的很想在基类后面隐藏一些接口(interface),难道没有其他方法可以做到这一点吗?或者按照c++ lang规范是不可能的。

最佳答案

如果想让多态指针转换在类外工作,那么继承必须是public。没有办法解决这个问题。

您可以添加一个成员函数来在类中进行多态指针转换:

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

这允许您这样做,同时仍然允许私有(private)继承:

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

我还没有遇到过这个技巧有用的真实世界设计,但适合你自己。


附言。请记住,您应该销毁您创建的对象。还要意识到 delete ptr 具有未定义的行为,除非 ~A 是虚拟的。

关于c++ - 错误 : 'A' is an inaccessible base of 'B' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39332489/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com