【发布时间】:2017-01-12 22:28:22
【问题描述】:
我的代码如下-
#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;
}
产生以下编译器输出 -
错误:
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 继承而不是private 或protected。
但是如果我真的想在基类后面隐藏一些接口,难道没有其他方法可以做到这一点吗?还是按照c++ lang规范是不可能的。
【问题讨论】:
-
具体来说,您想做什么?您的问题是您不希望通过
B访问A,但您确实希望通过B访问A。我怀疑是设计问题... -
好吧,您将 A 的继承设为私有。所以没有人知道 B 继承自 A。可能有一些私有或受保护继承的边缘情况,但不是这里。而将 B 分配给
A*的事实意味着您不想隐藏界面。 -
仅当
A是B的“可访问基”时,才允许使用A*指向B类型的对象。如果您想隐藏A是B的基这一事实,那么用户用指向A的指针来持有它是没有意义的。 -
"但是如果我真的想在基类后面隐藏一些接口,难道没有其他方法可以做到这一点吗?" 如果你允许人们转换@ 987654341@ 到
A*,那么界面不会被隐藏,对吗?您的问题似乎基于矛盾。也许您可以提供更多详细信息,说明您正在尝试完成的工作。 -
@YehezkelB。 - 不是指针的使用是不允许的;这是
B*到A*的转换。例如,如果该类提供了一个成员函数A* get_base_pointer() { return this; };,那么使用结果指针不会有任何问题。
标签: c++ class oop c++11 inheritance