【问题标题】:Why the member function can still be accessed even if it is declared as "private"? [duplicate]为什么即使声明为“私有”,成员函数仍然可以访问? [复制]
【发布时间】:2012-04-29 19:22:35
【问题描述】:

可能重复:
Public virtual function derived private in C++

class B
{
    private:
    int b;
    public:
    B(int i);
    virtual void show()
    {
        cout<<"B::show()called. "<<b<<endl;
    }
};

B::B(int i=0)
{
    b=i;
}

class D:public B
{
    private:
    int d;
    void show()
    {
        cout<<"D::show() called. "<<d<<endl;
    }
    public:
    D(int i, int j);
};

D::D(int i=0, int j=0):B(i)
{
    d=j;
}

void fun(B&obj)
{
    obj.show();
}
/*if I redefine fun() as follow, the result would be the same
void fun(B*obj)
{
obj->show();
}
*/
int main()
{
    D *pd=new D(5,8);
    fun(*pd);     //K
    delete pd;
}

程序的输出是“D::show() called.”,表示调用了类D的私有部分中声明的虚函数。你不觉得很奇怪吗?如何从外部访问类的私有成员?

【问题讨论】:

  • 这个问题有 999999 个重复。
  • 访问说明符只限制那些来自类外部的访问。因此,如果您编写 fun(D&) 或 fun(D*) 将无法使用静态链接访问 D::show() 并考虑到具体的兄弟类。使用具有公共成员 show() 的基类,您可以通过多态调用获得访问权限,该调用通过兄弟实现的障碍。啊! :) 我只是试图用更字面的方式来解释它。

标签: c++ virtual-functions private-members access-specifier


【解决方案1】:

关键部分是您的函数 void fun(B&amp;obj) 采用静态类型 B&amp; 的参数(因此转换发生在调用站点;B* 也是如此)。

由于B::show 公开的,你的代码调用它没有问题。当编译器查看如何调度调用时,它发现showvirtual,因此它调用D::show。如果objD 类型,你就不能调用D::show 这一事实是无关紧要的。

【讨论】:

  • 我发现如果我把虚函数show()放在基类B的私有部分,程序会编译失败,提示虚函数在基类中是私有的,即使派生类中的对应项声明为公共:#include using namespace std; class A{ private: virtual void function(){cout函数(); ao.function(); }
【解决方案2】:

与 Java 不同,在 C++ 中,访问说明符不会影响 virtual 函数。
“访问说明符”是一个编译时检查,它是在类方法上针对static 类型的句柄进行的。例如在您的代码中,obj 的类型为 BB::show() 的类型为 public;因此代码是合法的。
obj 可能会动态引用 B 以外的其他类型。

请记住,virtual 函数分派是一种运行时 现象。 (在 Java 中会出现运行时错误。)

B::show()public,一旦被调用,virtual 功能将启动并调用相应对象的函数。

如果您尝试直接调用D::show(),则会收到预期的编译器错误。

【讨论】:

  • “访问说明符不影响虚拟功能”您可能应该编辑这部分。我明白你的意思,但对于未经训练的人来说可能会感到困惑。
【解决方案3】:

这并不奇怪。在B 中,该方法是公开的。您可以B 对象上调用 show()

只是方法被分派到扩展类。

【讨论】:

    猜你喜欢
    • 2017-08-16
    • 2014-03-13
    • 2014-04-02
    • 1970-01-01
    • 2014-08-05
    • 2012-10-01
    • 2016-10-26
    • 1970-01-01
    相关资源
    最近更新 更多