你能帮帮我吗。我将自我传递给一个纯粹的虚拟功能。
n->dataCallback(handler, n, hangup);其中,n是我的类指针,而dataCallback是它自己的(纯)虚拟函数(我知道它没有任何意义,我只是想知道为什么会发生下面描述的事情)。
所以现在在声明中:
void MyClass::dataCallback(int handler, void *cbData, bool hangup) {
MyClass *This = (MyClass*) cbData;
....
}现在,当我在运行时将它(上面的变量)与它(对象的指针)进行比较时,我得到:
different.
之间没有其他代码。
这到底是怎么可能的?知道吗?
我花了两个小时思考这个问题,还问了其他没有结果的程序员。
发布于 2012-01-05 17:37:02
如果您有多个继承,则向每个父类转换指针可能会更改指针地址。请考虑以下几点:
class A
{
public:
int a;
};
class B
{
public:
int b;
};
class C : public A, B
{
};类C的内部布局将包含两个整数a和b。如果您将指针从C*转换为A*,那么一切都很好。如果将其转换为B*,则需要调整指针,因为B中的第一个元素必须是整数b!
如果您在编译器知道这两种类型的情况下进行强制转换,它将以一种您看不到的方式进行调整--它只是起作用。编译器知道正确的调整应该是什么。当您转换到void*时,这个机制就会崩溃。
发布于 2012-01-05 17:22:53
我们没有完整的测试用例,但是如果MyClass是多态的并且存在相关的类,那么转换可以改变指针值。void*的使用可能破坏了这一点。
发布于 2012-01-05 17:46:14
如果n是一个指向从实现dataCallback的类派生的类的指针,并且这个类有多个基类,则可能发生这种情况。只有一个(非空的)基对象可以具有与完整对象相同的地址。下面是一个例子,说明了这个问题:
#include <iostream>
struct Base {
int stuff;
virtual void f(void * p) {
std::cout << (p == this ? "GOOD\n" : "BAD\n");
}
};
struct Other {
int stuff;
virtual void g() {}
};
struct Derived : Other, Base {};
int main()
{
Derived t;
t.f(&t); // BAD: Passing pointer to Derived to member of Base
// (but not guaranteed to print "BAD" - layout is not specified)
Base & b = t;
b.f(&b); // GOOD: Passing pointer to Base to member of Base
}https://stackoverflow.com/questions/8746721
复制相似问题