【发布时间】:2017-01-07 11:34:01
【问题描述】:
我只是对下面关于继承的小程序感到困惑:
#include<iostream>
using namespace std;
struct B {
virtual int f() { return 1; }
}; // f is public in B
class D : public B {
int f() { return 2; }
}; // f is private in D
int main()
{
D d;
B& b = d;
cout<<b.f()<<endl; // OK: B::f() is public, D::f() is invoked even though it's private
cout<<d.f()<<endl; // error: D::f() is private
}
- 我不明白为什么
D::f()是私有的,D是从B继承的,所以B中的公共函数f
在D也是公开的(我知道没有继承,成员访问默认是私有的) -
f是B中的一个虚函数,所以如果我们调用b.f(),我们实际上是调用D::f(),但是就像上面的插图,为什么D::f()是私有的,也能被调用?李>
谁能详细解释一下简单的继承问题?
【问题讨论】:
-
我不明白为什么 D::f() 是私有的 -- 因为它是一个
private函数。当然不是public。你有一个class,你没有访问说明符,函数是private。 -
那么问题来了:为什么还能通过基类的函数调用呢?合理的推论...
-
拥有派生类
private的成员函数不会关闭虚拟机制。谢天谢地。许多设计模式都使用这种技术(例如模板模式),派生类将虚函数实现为私有(或受保护)。 -
我知道默认访问说明符是私有的,但是由于 D 是从 B 继承的 public,B 中的 public 函数也应该是 公开在D中,我的误会在哪里?
-
作为比较,请注意在 Java 中不能降低继承方法的可见性(因此,如果方法在超类中是公共的,则不能在子类中设为私有)。
标签: c++ inheritance private