static_casting基础对象对派生类的指针的地址

时间:2017-08-26 17:36:09

标签: c++ casting static

所以我在C ++中使用继承的概念来更好地理解它,我使用static_cast将基类对象的地址转换为派生类指针。

class A
{
public:
    A() { cout << "A's constructor called " << endl; }
};


class B:public A
{

public:
    B() { cout << "B's constructor called " << endl; }

    void funcinB() { cout << "Hello from B" << endl; }

};

int main()
{
    A a;
    B *b = static_cast<B*>(&a);
    if (b)
    {
        b->funcinB();
    }

}

程序调用B的方法,这是我不理解的,因为派生类对象从未被构造过。以下是程序的输出

A's constructor called
Hello from B

现在我知道你并没有像这样使用static_cast,但是我正在寻找一个解释为什么程序能够调用B&#39的方法。

谢谢!

2 个答案:

答案 0 :(得分:3)

您的程序有不确定的行为。

您的程序可以运行,因为许多(如果不是全部)编译器都会翻译

b->funcinB();

funcinB(b);

其中成员函数实现为:

void funcinB(B* const this) { cout << "Hello from B" << endl; }

如果您尝试访问函数中B的任何成员变量,行为会有所不同。

答案 1 :(得分:1)

方法本身只是一个函数 - 它总是具有相同的地址。

事实上,您可以想象(并且,通过我知道的所有调用约定,实际上就是这种情况),调用object.method(12)实际上调用了一个名为classname_method(classname *this, int parameter)的函数。在不同对象上调用方法时的更改只是this指针,而不是方法!

因此,如果你说服你的编译器你的指针指向派生类实例,那么它会愉快地调用该方法。