我有一个包含私有属性和虚方法的类。
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方法,但我不想更改类。 这怎么可能?有关从类外部访问私有方法和属性的任何参考吗?
答案 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'
但是,不要在真正的代码中使用这个黑色!这是非常糟糕的做法!由于此代码不完全可移植。