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; } 它产生以下编译器输出 –
如前所述 – 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是虚拟的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |