我们如何访问C++中的私有虚方法?

How can we access to the private virtual method in C++?

我有一个 class 包含一个私有 属性 和一个虚拟方法。

class A
{
  private:
    int var1;
    virtual int foo()
     { return var1;}
 public:
    A(){  var1 = 2; }
};

在我的 "main" 函数中我有:

 A a;
 cout<<func1(&a);

我想在 "func1" 中获取 var1 的值和 return 函数的 "foo" 值而不更改 class。 如果我想解决它,我可以为 var1 添加 set 和 get 方法,但我不应该更改 class。 这怎么可能?从 class?

外部访问私有方法和属性的任何参考

您无法从 class 外部访问私有方法。

但是,该方法是虚拟的,它可以被派生的 classes 覆盖,即使它是私有的。当调用虚方法时,将调用覆盖版本。

访问 class 的 private 方法和变量的唯一方法是通过 friend 声明——通过创建 class 或函数 friend.

如果不允许以任何方式修改 class,则无法从 func1.

访问 private 方法或变量

在 C++ 意识形态中,您不能读取或修改其他人的私有成员 类 - 它被命名为 'encapsulation'。

但是,这个 hack 代码将在所有流行的编译器上成功运行:

int& func1(A* a)
{
    struct Hacker  // copy of class A in memory by structure
    {
        int var1;
        virtual void fakeUnused() { }  // need because A have one virtual function too
    };
    Hacker* hacker = reinterpret_cast<Hacker*>(a);
    return hacker->var1;
}

现在,你可以读写了A::var1:

A a;
cout << func1(&a) << endl;  // prints '2'

func1(&a) = 3;
cout << func1(&a) << endl;  // prints '3'

但是,不要在实际代码中使用此 HACK! 这是非常糟糕的做法!由于此代码不完全可移植。

如前所述,您只能从同一个 class 中或通过 class[= 的友元函数访问 class 的私有成员28=]。

因为func既不是classA的成员,也不是classA的友元函数,所以不能调用私有函数foo 来自 func...除非我们进行一些更改。

观察到您正在将 A 对象的地址传递给 func 并且您希望调用私有函数 foo,然后将 func 作为好友实现A class 的功能应该是显而易见的选择。

#include<iostream>

class A
{
    public:
        A():var(2){}
        virtual ~A(){}
        friend int func(A const* a){return a->foo();}
    private:
        virtual int foo() const{return this->var;}
        int var;
};

int main()
{
    A a;

    std::cout << func(&a) << std::endl;

    return 0;
}