从类外部访问专用虚拟函数
Accessing a private virtual function from outside the class
我知道,就良好的编程实践而言,这是一个坏主意,但我一直在努力解决一个相对困难的问题,并希望获得一些见解。本质上,我试图输出一个类的所有成员如下:
class protoCalc
{
private:
int x;
int y;
virtual int basicAddition()
{
return x + y;
}
virtual int basicMultiplication()
{
return x*y;
}
public:
protoCalc(){
x = 14;
y = 120;
}
};
事实证明,访问x和y足够容易;为此,我写了一个函数(包括我对这是如何工作的想法,无论它们是否正确):
int private_member_Print(void* proto)
{
protoCalc* medium = (protoCalc*)proto;
protoCalc halfway = *medium;
int* ptr = ((int *)(&halfway));
return ptr[1];
}
上面将返回x的值,如果使用ptr[2],它将返回y的值。
现在我有两个问题,第一个问题是ptr[0]指向什么?这部分内存难道不应该被私人成员x占用吗?因为它是protoCalc类的第一个成员?如果没有,那么这个地址是什么?
第二,如何访问虚拟功能?我的第一个直觉是地址ptr[3]将被basicAddition()虚拟函数和ptr[4]basicMultiplication()函数占用,但事实并非如此。当这不成立时,我的下一个想法是ptr[0]包含指向虚拟成员表位置的指针,该表包含我正在寻找的两个函数。然而,这也被证明是错误的。
那么,当我访问了私有成员x和y时,我如何在类之外访问这些虚拟函数呢?显然,我可以改变环境,让事情变得更容易,但这会破坏问题的目的。
您当前所做的是未定义的行为。在大多数情况下,对象在内存中的布局由编译器决定,并且您不知道编译器将把每个成员放在内存的何处。
话虽如此,实现这一点的方法是大量滥用模板。我强烈建议不要这样做,而是提供成员功能来访问所需的数据。
这是一个实际操作的例子。
#include <iostream>
class Priv {
private:
int i;
void print( ) {
std::cout << i << std::endl;
}
public:
Priv( ) : i( 100 ) {}
void print_pub( ) {
std::cout << "Public" << std::endl;
this->print( );
}
};
template<typename Tag>
struct result {
/* export it ... */
typedef typename Tag::type type;
static type ptr;
};
template<typename Tag>
typename result<Tag>::type result<Tag>::ptr;
template<typename Tag, typename Tag::type p>
struct rob : result<Tag> {
/* fill it ... */
struct filler {
filler() { result<Tag>::ptr = p; }
};
static filler filler_obj;
};
template<typename Tag, typename Tag::type p>
typename rob<Tag, p>::filler rob<Tag, p>::filler_obj;
struct Priv_f { typedef void ( Priv::*type )(); };
template class rob< Priv_f, &Priv::print >;
struct Priv_i { typedef int Priv::*type; };
template class rob< Priv_i, &Priv::i >;
int main( ) {
Priv p;
(p.*result<Priv_i>::ptr) = 1;
(p.*result<Priv_f>::ptr)();
}
rob/result模板类的解释可以在这里找到。它应该跨编译器工作。
相关文章:
- C++无法定义虚拟函数 OUTER 类和头文件
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 类型擦除的std::function与虚拟函数调用的开销
- 重写虚拟函数和继承
- 用纯虚拟函数兜圈子
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 禁止子函数调用父级的抽象(或虚拟)函数
- 无法在子类中使用虚拟函数C++
- 无法在派生对象上运行虚拟函数
- 我可以调用从 main() 覆盖的虚拟函数吗?
- 在 C++ 中将函数获取和设置为虚拟函数
- 使用在堆栈上创建的对象调用虚拟函数
- 为什么在这种情况下不调用我的虚拟函数实现?
- 在C++中使虚拟函数私有化
- 模板继承类中的虚拟函数
- 为什么构造函数的虚拟函数调用有时有效,但其他调用却无效
- doxygenc++虚拟函数和实现
- 如何从派生类函数中调用虚拟函数