从基础到派生的“dynamic_cast”

2024-01-15

是的,我知道沮丧使用dynamic_cast无法编译,如果Base不是多态的,但我的问题不是这个。

class Base {
    public:
        virtual void bar()
        {
            cout << "bar\n";
        }
};

class Derived: public Base {
    public:
        void foo()
        {
            cout << "foo\n";
        }
};

int main()
{
    Base *pb;
    Derived *pd;

    pb = new Derived;  //Base* points to a Derived object
    pd = dynamic_cast<Derived*>(pb); 
    pd->foo();  //outputs foo

    pb = new Base;  //Base* points to a Base object
    pd = dynamic_cast<Derived*>(pb);  
    pd->foo();  //outputs foo, too. Why?
}

我以为当pb = new Derived;, pb实际上指向一个Derived对象位于堆中。后pd = dynamic_cast<Derived*>(pb);, pd还指出Derived对象,所以pd->foo()应该可以。

但当pb = new Base;, what pb指向的是一个Base堆中的对象,然后pd = dynamic_cast<Derived*>(pb);,怎么可能pd->foo()作品?做过dynamic_cast关闭Base堆中的对象变成Derived object?


在 C++ 中,类的每个实例都有自己的数据类型版本,但所有类在内存中共享相同的函数(内联函数除外)。就你而言,当你说这样的话:

pd->foo();

你本质上是在打电话Derived::foo,这是内存中的一个函数,编译器知道它在哪里。问题是,它并不依赖于pd根本不。但是,如果你有这样的事情:

class Derived : public Base {
    private:
        int a;

    public:
        Derived() { a = 100; }

        void foo() {
            std::cout<<a<<std::endl;
        }
 };

Then, pd->foo()会导致分段错误。在这里,你的动态转换失败了,当Derived::foo被调用,被传递0 as the this目的。在之前的例子中,这很好,因为this对象从未被使用过。然而,在第二种情况下,它被使用,因此导致分段错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从基础到派生的“dynamic_cast” 的相关文章

随机推荐