c++ - static_pointer_cast<Derived> pReallyABase = static_pointer_cast<Derived>(pBase) 有效!为什么?

标签 c++ pointers inheritance downcast

<分区>

我不明白为什么会这样。 pReallyABase 是一个向下转换的 shared_pointer< Derived >,它指向一个基类实例。

我理解为什么编译器让我调用 pReallyABase->onlyForDerived() 因为我将它定义为派生类指针,但是当我尝试使用该指针调用派生类函数时为什么没有出现运行时错误?

class Base { 
    public:
        virtual string whatAmI() {
            return "I am a Base";
        }
};

class Derived : public Base {
    public:
        virtual string whatAmI() {
            return "I am a Derived";
        }

        string onlyForDerived() {
            return "I can do Derived things";
        }
};


int main(int argc, char *argv[]) { 
    shared_ptr<Base> pBase = shared_ptr<Base>(new Base);
    shared_ptr<Derived> pReallyABase = static_pointer_cast<Derived>(pBase);

    cout << pReallyABase->whatAmI() << endl;
    cout << pReallyABase->onlyForDerived() << endl;  //Why does this work?
    return 0;
}

结果

I am a Base
I can do Derived things

最佳答案

关于成员函数(非静态和非虚拟)在C++中是如何被调用的,《Inside C++ object model》一书中对此有解释:

一个 C++ 设计标准是非静态成员函数至少必须是 与其类似的非成员函数一样有效。应该没有额外的开销 用于选择成员函数实例。这是通过内部转换实现的 成员实例转换为等效的非成员实例。经过这些改造 它的每个调用也必须进行转换:例如:

obj.magnitude();

成为

magnitude_7Point3dFv(&obj);

ptr->magnitude();

成为

magnitude_7Point3dFv(ptr);

因此,如上例所示,onlyForDerived 函数没有使用 Derived 类的任何成员变量,因此可以正常工作。但这是一个未定义的行为,我们不应该依赖它。

关于c++ - static_pointer_cast<Derived> pReallyABase = static_pointer_cast<Derived>(pBase) 有效!为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25045656/

相关文章:

c++ - 将 std::shared_ptr 与 protected 构造函数\析构函数一起使用

java - 子类设置方法不起作用

python - Sphinx - 从父方法插入参数文档

c - 如何将函数输出分配给数组类型?在 C 中?

c++ - 在 C++ 中删除 forward_list 是否安全?

flutter - Dart继承类并在父类的函数中使用

c++ - Boost WITH Writer block 中的多读取器、单写入器锁定

c++ - 导出对象渲染opengl

c++ - 不纯就用虚成员函数?

c - sizeof 运算符在 C 中接受哪些参数?