【发布时间】:2015-03-06 16:51:21
【问题描述】:
为什么 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;
}
【问题讨论】:
-
因为 c++ 不在乎你是否在脚上开枪 :)
-
a1::fun()、a2::fun()和a3::fun()是三个独立的函数,因为前两个函数都没有声明为virtual。所以不要认为每个派生类都覆盖了之前的函数。您可以随意调用任何您想要的继承函数,这通常非常有用。 -
考虑组合而不是继承,或者私有/受保护的继承
-
为什么会被禁止?这是一种公共方法。您甚至可以通过基类指针从外部调用它(缺少 virtual 关键字?)
-
@Cyber:那为什么 Java 不允许这样做?
标签: java c++ inheritance