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



我遇到了用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.

谁能解释为什么会这样?在第一种情况下,私有函数是通过一个对象调用的。

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

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

不能直接从类定义外部访问类的私有接口。如果你想在第二个实例中访问私有函数而不使用友元函数,正如你的问题标题所暗示的那样,在你的类中创建另一个公共函数。使用该函数调用此私有函数。喜欢这个。

 int call_fun (int i) ;

从里面呼叫fun()

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

像这样仅用于调用另一个函数的函数称为 wrapper functions

也并不总是建议friends。这违背了信息隐藏的原则。

相关内容

  • 没有找到相关文章

最新更新