我认为它是因为基类数据成员和方法不可访问,但我想更清楚一点。另外,这是多态(使用虚函数)只能在公共继承下才可能的原因吗?
答案 0 :(得分:13)
实际上,即使基类是私有的,指向base的指针也可以指向派生类。问题是,从外部类开始这种转换是不可能的。但是,仍然可以在可以访问基础的上下文中执行此类转换。
示例:
#include <iostream>
using namespace std;
struct Base
{
void foo() const {
cout << "Base::foo()\n";
}
};
struct Derived : private Base
{
const Base* get() const {
return this; // This is fine
}
};
int main()
{
Derived d;
const Base *b = &d; // This is illegal
const Base *b = d.get(); //This is fine
b->foo();
}
答案 1 :(得分:1)
如果我是对的,那你就是在询问课堂内的元素可见性。 正如您所说,public / protected / private将影响您的成员/函数成员/方法的可访问性。 (见Difference between private, public, and protected inheritance) 然而,多态性不仅限于公共继承。
示例:强>
class B
{
protected:
virtual void do_B() = 0;
};
class A : protected B
{
virtual void do_B() {};
};
答案 2 :(得分:1)
这是一个可以帮助您更好地理解的例子
class Base{
public:
int foo;
};
class Derived: private Base{
public:
int bar;
};
现在在这个程序中,让我们看看派生类对象可以做什么。 派生类对象可以
现在让我们看看如果Base指针可以指向这样的对象,会发生什么。对于基类指针,
现在你可以看到,如果基指针指向私有关系下继承的类的对象,它将面临歧义。
歧义:根据派生类对象,foo是私有的,但是基指针认为它是公共的。
如果允许这样的话,那么私人或受保护的继承的士气就会丧失。 我希望这能清除你的怀疑。