指向不同实例的指针.

Eug*_*gen 1 c++ visual-studio-2012

IWindow指针明确地ISheet具有没有方法的类的地址时,这样的代码如何正常工作Say

#include <iostream>

using namespace std;

class IWindow
{
private:
    int p;
    double f;
public: 
    void Say() { cout << "Say in IWindow"; }
};

class ISheet
{
public:
    void foo() { cout << "ISheet::foo"; }
};

int main()
{
    ISheet *sh = new ISheet();
    int ptr = (int)sh;
    IWindow *w = (IWindow*)ptr;
    w->Say();
    sh->foo();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在Visual Studio 2015中编译时,它运行并执行没有任何问题,但我希望在线获得错误w->Say().这怎么可能?

kfs*_*one 5

它的工作原理是全能的未定义行为.您的函数不会尝试访问包含类的任何数据成员,只是写一些东西std::cout,任何人都可以做.

你有效地做了什么

#include <iostream>

void IWindow_Say(void*)
{
    std::cout << "Say in IWindow";
}

int main()
{
    IWindow_Say(0xdeadbeef);  // good luck with that pointer
}
Run Code Online (Sandbox Code Playgroud)

你从未使用过指针(this原来的例子),因此没有观察到任何副作用.