0

转换.h

class Base 
{
public:
    void foo();
};

class Derived: public Base 
{
public:
    void bar();
};

class A {};
class B 
{
public:
    void koko();
};

转化率

void Base::foo()
{
    cout<<"stamm";
}

void Derived::bar()
{
    cout<<"bar shoudn't work"<<endl;
}
void B::koko()
{
    cout<<"koko shoudn't work"<<endl;
}

主文件

#include "conv.h"
#include <iostream>
int main()
{   
    Base * a = new Base;
    Derived * b = static_cast<Derived*>(a);
    b->bar();

    Derived * c = reinterpret_cast<Derived*>(a);
    c->bar();

    A* s1 = new A;
    B* s2 = reinterpret_cast<B*>(s1);
    s2->koko();
}

输出:

bar shoudn't work
bar shoudn't work
koko shoudn't work

尽管我创建了一个未派生的基类,但如何在运行时成功调用方法栏?它甚至适用于两种类型的转换(静态和重新解释转换)。

与上述相同的问题,但与不相关的类(A 和 B)?

4

3 回答 3

6

未定义的行为可以做任何事情,包括看起来有效。

于 2012-09-16T21:49:35.223 回答
1

它正在工作(阅读:“编译而不崩溃”)因为您从不this在名义上的“成员”函数中使用指针。例如,如果你试图打印出一个成员变量,你会得到你所期望的垃圾输出或崩溃——但这些函数现在并不依赖于它们应该属于的类中的任何内容。 this甚至可以NULL为他们所关心的一切。

于 2012-09-16T21:58:10.250 回答
0

编译器知道Derived可以使用成员函数foo()bar()并且知道在哪里可以找到它们。在你做了你的“技巧”之后,你有了指向Derived.

它们是类型的指针这一事实Derived——无论哪些数据与这些指针相关联——允许它们调用函数foo()kook()与 Derived 相关联。

如前所述,如果您实际使用了指针处的数据(即读取或写入相对于this属于派生类的数据成员(在这种情况下您没有),那么您将访问没有的内存' t 属于你的对象。

于 2012-09-16T22:25:45.830 回答