【发布时间】:2014-12-29 01:23:31
【问题描述】:
我知道,就良好的编程实践而言,这是一个坏主意,但我一直在尝试解决一个相对困难的问题,并希望获得一些见解。本质上,我试图输出一个类的所有成员,如下所示:
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 时,如何在类之外访问这些虚函数呢?显然我可以改变环境以使其更容易,但这会破坏问题的目的。
【问题讨论】:
-
这都是未定义的行为。如果您想这样做,请提供用于访问私有成员的公共函数。
-
一看到 void 指针和演员表,我就停止阅读。接下来的任何事情对我的大脑都没有好处。
-
您不必担心,但您的函数可以设为 const。如果一个类有虚函数,它可能应该有一个虚析构函数。
-
我一定不是特别清楚问题的设置。我可以修改的唯一代码在我的“private_member_Print”函数中。为了解决方案的目的,类中的所有内容都必须保持原样
-
在实践中
ptr[0]可能指向虚函数表指针,但你不能依赖它。 stackoverflow.com/questions/10925115/…
标签: c++ private-members