我认为,它与C++是非常相似的,它不是Python的“官方咒语”。< / P> < P>你问:,java,c++,inheritance,Java,C++,Inheritance" /> 我认为,它与C++是非常相似的,它不是Python的“官方咒语”。< / P> < P>你问:,java,c++,inheritance,Java,C++,Inheritance" />

为什么是c++;允许直接从子类中调用祖父母类方法吗? 为什么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; } #包括 a1类 { 公众: 虚无乐趣() { Python有一个基本范例:“我们都是受过教育的成年人”。换句话说:语言的设计者理解某些功能可能被误用;但他们指望程序员的理智来小心 我认为,C++和C++是完全相同的,它不是Python的“官方咒语”。 < Python有一个基本范式:“我们都是受过教育的成年人”。换句话说:语言的设计者理解某些特性可能被滥用,但是他们依赖程序员的理智来小心。 P>我认为,它与C++是非常相似的,它不是Python的“官方咒语”。< / P> < P>你问:

为什么是c++;允许直接从子类中调用祖父母类方法吗? 为什么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; } #包括 a1类 { 公众: 虚无乐趣() { Python有一个基本范例:“我们都是受过教育的成年人”。换句话说:语言的设计者理解某些功能可能被误用;但他们指望程序员的理智来小心 我认为,C++和C++是完全相同的,它不是Python的“官方咒语”。 < Python有一个基本范式:“我们都是受过教育的成年人”。换句话说:语言的设计者理解某些特性可能被滥用,但是他们依赖程序员的理智来小心。 P>我认为,它与C++是非常相似的,它不是Python的“官方咒语”。< / P> < P>你问:,java,c++,inheritance,Java,C++,Inheritance,这不违反封装吗 在某种程度上是这样的。理想情况下,如果a3需要从它的祖先类访问任何功能,它应该通过它的直接基类,即父类。如果设计发生变化,并且a2不再是从a1派生的,那么a3::fun中的代码将中断 你问: 原因是什么 很可能有一长串的原因,太长了,不适合这样的回答。我怀疑主要原因是允许程序员灵活地做对他们有意义的事情。你问: 这不违反封装吗 在某种程度上是这样的。理想情况下,如果a3需要从它的祖先类访问任何功能,它应该通过它的直接基类,即父类。如果设计发生变化,并且a2不再是从a1派生的,那么

这不违反封装吗

在某种程度上是这样的。理想情况下,如果
a3
需要从它的祖先类访问任何功能,它应该通过它的直接基类,即父类。如果设计发生变化,并且
a2
不再是从
a1
派生的,那么
a3::fun
中的代码将中断

你问:

原因是什么

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

你问:

这不违反封装吗

在某种程度上是这样的。理想情况下,如果
a3
需要从它的祖先类访问任何功能,它应该通过它的直接基类,即父类。如果设计发生变化,并且
a2
不再是从
a1
派生的,那么
a3::fun
中的代码将中断

你问:

原因是什么


最有可能是一长串的原因,太长了,无法适应这样的答案。我怀疑主要原因是允许程序员有能力做对他们有意义的事情。

因为C++不在乎你在脚上开枪:<代码> A1::Fun.()/<代码>,<代码> A2::Fun.] /<代码>和<代码> A3::Fun.()< /代码>有三个独立的函数,因为前两个函数都没有声明为“代码>虚拟< /代码>。因此,不要认为每个派生类都重写了以前的函数。您可以自由调用所需的任何继承函数,这通常是非常有用的。它是一个公共的方法?它甚至可以通过基类指针(缺省的虚拟关键字)从外部调用它:@ java:为什么Java不允许这样做?因为C++不关心你在脚中开枪:<代码> A1::FUNTHONE()/CUT>,<代码> A2::FUNTHONE()/<代码>和<代码> A3::Fund()< /代码>有三个独立的函数,因为前两个函数都没有声明为“代码>虚拟< /代码>。因此,不要认为每个派生类都重写了以前的函数。您可以自由调用所需的任何继承函数,这通常是非常有用的。禁止吗?这是一个公共方法。你甚至可以通过基类指针从外部调用它(缺少虚拟关键字?)@赛博:那为什么Java不允许这样做呢?@R Sahu:谢谢,我对你的回答很满意。但是,如果设计发生变化,a2不再从a1派生,a3::fun中的代码将崩溃,这是什么意思?Thanks@meet,在程序的生命周期中,有时需要重新组织类层次结构。在将来的某个日期,这可能是有意义的使
a2
成为
foo
的一个子类,该子类不是从
a1
派生的。那时,
a1
不是
a3
的祖先类。因此,您不能从
a3::fun()调用
a1::fun()
@R Sahu:谢谢,我对你的回答很满意。但是如果设计发生了变化,a2不再从a1派生,a3::fun中的代码将被破坏,这是什么意思?Thanks@meet,在程序的生命周期中,有时需要重新组织类层次结构。在将来的某个日期,将
a2
a子类
foo的ass
,它不是从
a1
派生出来的。那时,
a1
不是
a3
的祖先类。因此,您不能从
a3::fun()
调用
a1::fun()。