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

时间:2015-11-03 17:37:55

标签: c++ object private-members

我有一个包含私有属性和虚方法的类。

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

在我的“主要”功能中,我有:

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

我想获取var1的值并在“func1”中返回“foo”函数的值而不更改类。 如果我想解决它,我可以为var1添加set和get方法,但我不想更改类。 这怎么可能?有关从类外部访问私有方法和属性的任何参考吗?

4 个答案:

答案 0 :(得分:5)

您无法从课堂外访问私有方法。

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

答案 1 :(得分:3)

访问类的private方法和变量的唯一方法是通过friend声明 - 将类或函数设为friend

如果您不允许以任何方式修改课程,则无法从private访问func1方法或变量。

答案 2 :(得分:0)

如前所述,您只能从同一个班级或通过班级的朋友功能访问班级的私人成员。

由于func既不是类A的成员,也不是类A的朋友函数,因此您无法从foo调用私有函数func } ...除非我们做出一些改变。

观察您将A对象的地址传递给func并且您希望调用私有函数foo,然后将func作为朋友函数实现A类应该是明显的选择。

#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;
}

答案 3 :(得分:-2)

在C ++意识形态中,您无法读取或修改其他类中的私有成员 - 它被命名为“封装”。

但是,这个黑客代码将成功地适用于所有流行的编译器:

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'

但是,不要在真正的代码中使用这个黑色!这是非常糟糕的做法!由于此代码不完全可移植。