【发布时间】:2016-03-28 06:16:55
【问题描述】:
我来自 Java,它不允许在派生类中减少访问修饰符。例如,以下内容在 Java 中无法编译:
public class A{
public void foo(){ }
}
public class B extends A{
@Override
private void foo(){ } //compile-error
}
但是,在 C++ 中没问题:
struct A {
A(){ }
virtual ~A(){ }
A(A&&){ }
public:
virtual void bar(){ std::cout << "A" << std::endl; }
};
struct B : public A{
private:
virtual void bar(){ std::cout << "B" << std::endl; }
};
int main()
{
A *a = new B;
a -> bar(); //prints B
}
它可能在哪里有用?此外,这样做安全吗?
【问题讨论】:
-
顺便说一句,结构 A 中的
public修饰符什么都不做,因为结构中的所有内容默认情况下都是公共的。 -
就个人而言,我不建议更改访问级别,因为我认为这可能会造成混淆。但是,我不知道为什么它会被认为是不安全的,也不知道它为什么有用。相关的是,拥有一个由非虚拟公共函数调用的私有虚拟函数会很有用。请参阅 NVI(非虚拟接口)习语。
-
@JamesAdkison 这是“不安全的”,因为它让外部代码直接调用私有函数,这与私有函数的全部观点相矛盾。
-
@immibis 我的意思是从 UB 的角度来看是不安全的。并且基类打算将其公开,因此 IMO 派生类期望任何比公共访问更少的东西是错误的。
标签: java c++ inheritance virtual-functions