8

我认为这是因为基类数据成员和方法无法访问,但我希望对此更清楚一些。另外,这就是为什么多态性(使用虚函数)只能在公共继承下才有可能的原因吗?

4

3 回答 3

13

实际上,即使基类是私有的,指向基类的指针也可以指向派生类。问题是这样的转变是不可能从班发生的。但是,仍然可以在可以访问基础的上下文中执行这种转换。

例子:

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

活生生的例子

带有虚拟呼叫的实时示例

于 2013-05-21T09:24:54.313 回答
1

如果我是对的,那么您是在询问类中元素的可见性。正如您所说,公共/受​​保护/私有将影响您的成员/功能成员/方法的可访问性。(请参阅私有继承、公共继承和受保护继承之间的区别)但是,多态性并不限于公共继承。

例子:

class B
{
    protected:
        virtual void do_B() = 0;
};

class A : protected B
{
    virtual void do_B() {};
};
于 2013-05-21T09:32:47.180 回答
1

这是一个示例,可以帮助您更好地理解

class Base{
  public:
  int foo;
};
class Derived: private Base{
  public:
  int bar;
};

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

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

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

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

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

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

因此,如果允许这样的事情,私人或受保护继承的士气就会丧失。我希望这能消除你的疑问。

于 2013-05-21T09:54:27.303 回答