【问题标题】:Typical problem on Inheritance [duplicate]继承的典型问题[重复]
【发布时间】:2011-04-10 05:40:53
【问题描述】:

可能重复:
Why is this not allowed in C++?

为什么在 C++ 中不允许这样做...??

class base
{
  private:

  public:
      void func()
         {
              cout<<"base";
         }  


};

class derived : private base
{
  private:


  public:
            void func()
         {
              cout<<"derived";
              }


};

int main()
{
base * ptr;
ptr = new derived;
((derived *)ptr)->func();
return 0;
}

我收到一个错误

**61 C:\Dev-Cpp\My Projects\pointertest.cpp `base' is an inaccessible base of `derived'** 

我的问题是,由于 func() 是在派生类中定义的 public 和声明 ((派生*)ptr)->func();正在尝试显示 derived 的 func()..为什么由于继承模式而存在可访问问题..尽管我已经有公共派生 func,但继承模式(私有)如何影响调用() 在派生类中..?

如果将继承模式更改为公共,我会得到我想要的结果..但是 func() 在 base 中是私有的(因此 base 的 func() 不是继承的)并且 func() 在派生中是公共的和继承模式是public为什么我仍然得到我想要的结果..我应该像以前的情况一样得到一个编译错误吗??

我完全糊涂了..请告诉我编译器在这种情况下是如何工作的..??

【问题讨论】:

  • 看起来也很像家庭作业
  • 不是重复的,其他线程没有演员表。
  • 提示:不是func 无法访问。再次阅读错误消息,并检查它指的是哪一行。
  • @Philipp 你是认真的 :) 吗?我认为他只是绝望地添加了演员,希望它能解决错误。

标签: c++ inheritance pointers derived-class


【解决方案1】:

当有私有继承时,不能让基指针指向派生对象。

公共继承表示isa关系。另一方面,私有继承表示根据关系实现

编译错误指的是以下行: ptr = new derived;

【讨论】:

  • 你的答案可能是正确的,如果 cmets 中的聪明人对重复都是错误的。
  • 那么“具有”私有继承和聚合之间有什么区别?
  • +1,因为第一行是实际问题。现在,私有继承模型根据实现,而不是有一个,它将用组合建模。
  • @Cedric 通过聚合,您可以使用多个对象,例如“有很多”,但通过私有继承,您只能使用一个。
  • @Cedric:私有继承允许您覆盖虚函数并访问基类的受保护成员。
猜你喜欢
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
相关资源
最近更新 更多