为什么基指针只能在公共继承下指向派生对象?

时间:2013-05-21 09:17:12

标签: c++ pointers inheritance

我认为它是因为基类数据成员和方法不可访问,但我想更清楚一点。另外,这是多态(使用虚函数)只能在公共继承下才可能的原因吗?

3 个答案:

答案 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();
}

Live example

Live example with virtual call

答案 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;
};

现在在这个程序中,让我们看看派生类对象可以做什么。 派生类对象可以

  • 公开访问整数变量栏。
  • 私有访问整数变量foo(仅在Derived类中),因为继承关系是私有的。

现在让我们看看如果Base指针可以指向这样的对象,会发生什么。对于基类指针,

  • Base指针无法访问变量栏,因为它只指向派生类对象的基本部分。
  • 根据基类指针,变量foo是public,因为它已在基类下定义为公共。

现在你可以看到,如果基指针指向私有关系下继承的类的对象,它将面临歧义。

歧义:根据派生类对象,foo是私有的,但是基指针认为它是公共的。

如果允许这样的话,那么私人或受保护的继承的士气就会丧失。 我希望这能清除你的怀疑。