为什么c ++允许直接从子类中调用祖父类方法?

时间:2015-03-06 16:51:22

标签: java c++ inheritance

为什么C ++允许直接从子类中调用祖父类方法。这不违反封装吗?像Java这样的语言不允许绕过父类方法意味着不允许使用super.super.method()。但它在C ++中是有效的。是什么原因?请考虑以下代码。

#include <iostream>
class a1 
{
  public:
  void fun()
 {
    std::cout<<"fun() in a1\n";
 }
};

class a2 : public a1
{
   public:
   void fun() 
   {
       std::cout<<"fun() in a2\n";
   }
};

class a3 : public a2
{
   public:
   void fun()        // Bypass call to a2 class' method
   {
       a1::fun();
       std::cout<<"fun() in a3\n";
   }
};

int main()
{
     a3 a;
     a.fun();
     return 0;
}

2 个答案:

答案 0 :(得分:2)

你问:

  

是否违反了封装?

它确实在某种程度上。理想情况下,如果a3需要从其祖先类访问任何功能,它应该通过其直接基类,即父类。如果设计更改且a2不再来自a1,则a3::fun中的代码将会中断。

你问:

  

是什么原因?

很可能有一长串原因,太长时间不适合SO答案。我怀疑主要原因是允许程序员灵活地做对他们有意义的事情。

答案 1 :(得分:1)

Python有一个基本范例:“我们都是受过良好教育的成年人”。换句话说:语言的设计者理解某些特征可能被滥用;但他们指望程序员的理智要小心。

在我看来,它与C ++非常相似;它只是不是一个“官方口头禅”,因为它与python。