为什么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;
}
答案 0 :(得分:2)
你问:
是否违反了封装?
它确实在某种程度上。理想情况下,如果a3
需要从其祖先类访问任何功能,它应该通过其直接基类,即父类。如果设计更改且a2
不再来自a1
,则a3::fun
中的代码将会中断。
你问:
是什么原因?
很可能有一长串原因,太长时间不适合SO答案。我怀疑主要原因是允许程序员灵活地做对他们有意义的事情。
答案 1 :(得分:1)
Python有一个基本范例:“我们都是受过良好教育的成年人”。换句话说:语言的设计者理解某些特征可能被滥用;但他们指望程序员的理智要小心。
在我看来,它与C ++非常相似;它只是不是一个“官方口头禅”,因为它与python。