代码之家  ›  专栏  ›  技术社区  ›  JeffR

如何使用动态浇铸

  •  0
  • JeffR  · 技术社区  · 6 年前

    我正在尝试使用动态演员表-但没有成功。我有一个基类,和一个从基派生的类A。我想有一个指向基类对象的指针,稍后我想将其强制转换为类A。显然我做的不正确。以下代码编译:

    #include <cstdio>
    
    class BASE {
    private:
    
        int i;
    
    public:
    
         BASE(void) {i = 1; }
         virtual ~BASE(){}
    
         virtual void id() { printf("CLASS BASE\n"); }
     };
    
    class A : public BASE {
    public:
        A(void): BASE() {}
        A(const BASE & base) : BASE(base) {}
        A& operator = (const BASE & base) { static_cast<BASE&>(*this) = base; return *this; }
    
        void id() override { printf("CLASS A\n"); };
    };
    
    
    int main() {
    
        BASE* base = new BASE();
    
        base->id();
    
        A* a = new A(*base);
    
        a->id();
    
        A* anotherA = dynamic_cast<A*>(base);
    
        if(!anotherA) 
            printf("anotherA is NULL\n");
        else    
            anotherA->id();
    }
    

    但是运行它可以:

    CLASS BASE
    CLASS A
    anotherA is NULL
    

    我确信我遗漏了一些非常基本的东西,但是我一直盯着代码看,看不到我做错了什么。任何帮助都将不胜感激。

    我看过

    When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?

    但不明白为什么动态角色扮演不起作用-这不是一个简单的角色扮演吗?

    1 回复  |  直到 6 年前
        1
  •  5
  •   n. m. could be an AI    6 年前

    我肯定我遗漏了一些非常基本的东西

    是的。

    当你有一个 对象 类型 A ,和 指针 到那个类型的对象 A* , the 指针 无法转换为类型 BASE* 。部分转换 忘记 有关类型的信息。

    现在给出一个类型的指针 基* , 如果 这个指针实际上指向 对象(即,它是从类型转换而来的 在某个时刻),你可以 回忆 通过将指针强制转换回类型来忘记类型信息 .

    如果指针未指向类型的对象 首先,没有什么被遗忘,也没有什么可以回忆。