#include <iostream>
using namespace std;
class A {
public:
A ();
virtual ~A();
};
class B: protected A {
public:
virtual ~B ();
};
int main() {
A* pb = new B;//A is inaccessable base of B
return 0;
}
当我运行上面的代码时,它告诉我A是B不可访问的基础,pb是指针,指向B的指针,有什么问题?
答案 0 :(得分:8)
B类派生自A类,但将其标记为受保护。 这意味着只有B'的子类'看到'B派生自A。
由于主例程不是B的子类,它只看到B,而不是B从A派生。 因此,您不能将B指针强制转换为A指针。
要解决此问题,请将其更改为:
class B: public A {
public:
virtual ~B ();
};
答案 1 :(得分:2)
B受保护继承自A,因此只有B'的子类知道'它是A'。静态main()不“知道”它,因为它不从B继承。
在这种情况下你可以将B作为A来访问:
class C: B {
void foo() {
A* pb = new B;
}
};
如果您需要在主要内容中,则需要将B更改为公开继承自A
答案 2 :(得分:1)
这是因为你从protected
继承了A.将其更改为public
,您将获得预期的结果。
请参阅C ++ FAQ部分24.5 here。
答案 3 :(得分:1)
问题是受保护的继承。 B不是A. B有A.有关详细信息,请参阅此FAQ。
答案 4 :(得分:0)
如果你改变了
class B: protected A
到
class B: public A
有效吗?
答案 5 :(得分:0)
问题是你从A继承B为protected
,因此外部代码不允许'知道'B继承自A.用public替换protected,代码应该编译。
答案 6 :(得分:0)
从B
导出public A
,而不是protected A
:
class B: public A
{
public:
virtual ~B ();
};
答案 7 :(得分:0)
您正在使用受保护的继承。受保护,当应用于成员时,意味着“派生类可以访问,但外部调用者不能访问”。当应用于继承时,它意味着......完全相同的事情。
因此,在B
类中,您知道它来自A
,并且可以转换为A*
并返回
在B
之外的 (例如,在main
函数中),继承不可见,因此您无法转换{{1转到B*
。
答案 8 :(得分:0)
#include <iostream>
using namespace std;
class A {
public:
A () {};
virtual ~A();
};
class B: public A {
public:
B() {};
virtual ~B ();
};
int main() {
A* pb = new B;
return 0;
}
这似乎有效。在您的示例中,您为将来的继承做好准备,受保护的继承使A受保护,只有B方法可以看到A.
答案 9 :(得分:0)
继承的属性排除了将受保护的父类派生到子类中的可能性。因此,在类代码中实际上不会发生类A到B类的属性。除非您在行protected
中将public
更改为#10
,否则将遵循协议,代码如下所示:
class B: public A
{
public:
virtual ~B ();
};