在C ++中,如何在不使用友元函数的情况下通过对象调用私有函数?

时间:2012-09-22 19:41:48

标签: c++ oop polymorphism dynamic-binding

我遇到了用C ++编写的代码:

#include<iostream>
using namespace std;

class Base {
public:
    virtual int fun(int i) { cout << "Base::fun(int i) called"; }
};

class Derived: public Base {
private:
    int fun(int x)   { cout << "Derived::fun(int x) called"; }
};

int main()
{
    Base *ptr = new Derived;
    ptr->fun(10);
    return 0;
}

输出:

 Derived::fun(int x) called 

在以下情况中:

#include<iostream>
using namespace std;

class Base {
public:
    virtual int fun(int i) { }
};

class Derived: public Base {
private:
    int fun(int x)   {  }
};
int main()
{
    Derived d;
    d.fun(1);
    return 0;
} 

输出

Compiler Error.

任何人都可以解释为什么会这样吗?在第一种情况下,通过对象调用私有函数。

2 个答案:

答案 0 :(得分:4)

因为在第一种情况下,您使用来自Base的声明,该声明是公开的,并且该呼叫后期绑定到Derived实现。请注意,更改继承中的访问说明符是危险的,几乎总是可以避免。

答案 1 :(得分:3)

在第一种情况下发生多态性。它会导致动态或后期绑定。正如第二个答案中所提到的那样,它有时会变得相当危险。

您无法直接从类定义外部访问类的专用接口。如果您想在不使用友元函数的情况下访问第二个实例中的私有函数,如问题标题所示,请在您的类中创建另一个公共函数。使用该函数调用此私有函数。像这样。

 int call_fun (int i) ;

从里面调用fun()

int call_fun (int i)
{
  return fun (i) ;  //something of this sort, not too good
}

这些仅用于调用其他函数的函数称为wrapper functions

始终不建议friends。这违反了信息隐藏的原则。