首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++将自我转化为自我迷思

c++将自我转化为自我迷思
EN

Stack Overflow用户
提问于 2012-01-05 17:19:05
回答 3查看 270关注 0票数 0

你能帮帮我吗。我将自我传递给一个纯粹的虚拟功能。

代码语言:javascript
复制
n->dataCallback(handler, n, hangup);

其中,n是我的类指针,而dataCallback是它自己的(纯)虚拟函数(我知道它没有任何意义,我只是想知道为什么会发生下面描述的事情)。

所以现在在声明中:

代码语言:javascript
复制
void MyClass::dataCallback(int handler, void *cbData, bool hangup) {
    MyClass *This = (MyClass*) cbData;
 ....
}

现在,当我在运行时将它(上面的变量)与它(对象的指针)进行比较时,我得到:

different.

  • When检查一个memeber (这个->成员),我在它们中找到了不同的值。(正确的值在这里,而这个值包含一个未定义的(对我来说是随机的)值。请注意,调用方的值当然是正确的,因此它似乎在调用过程中发生了神奇的变化,并且在.

之间没有其他代码。

这到底是怎么可能的?知道吗?

我花了两个小时思考这个问题,还问了其他没有结果的程序员。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-05 17:37:02

如果您有多个继承,则向每个父类转换指针可能会更改指针地址。请考虑以下几点:

代码语言:javascript
复制
class A
{
public:
    int a;
};

class B
{
public:
    int b;
};

class C : public A, B
{
};

类C的内部布局将包含两个整数ab。如果您将指针从C*转换为A*,那么一切都很好。如果将其转换为B*,则需要调整指针,因为B中的第一个元素必须是整数b

如果您在编译器知道这两种类型的情况下进行强制转换,它将以一种您看不到的方式进行调整--它只是起作用。编译器知道正确的调整应该是什么。当您转换到void*时,这个机制就会崩溃。

票数 2
EN

Stack Overflow用户

发布于 2012-01-05 17:22:53

我们没有完整的测试用例,但是如果MyClass是多态的并且存在相关的类,那么转换可以改变指针值。void*的使用可能破坏了这一点。

票数 0
EN

Stack Overflow用户

发布于 2012-01-05 17:46:14

如果n是一个指向从实现dataCallback的类派生的类的指针,并且这个类有多个基类,则可能发生这种情况。只有一个(非空的)基对象可以具有与完整对象相同的地址。下面是一个例子,说明了这个问题:

代码语言:javascript
复制
#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
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8746721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档