我们如何访问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;
}
我有一个 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;
}