如何在 C++ 中使用动态转换正确地向下转换基类?

问题描述

父类A和子类B成为

// A.h
#include <iostream>
struct A {
    virtual void print() {
        std::cout << "A" << std::endl;
    }
};

#include <iostream>
#include "A.h"

struct B : public A {
    void print() override {
        std::cout << "B" << std::endl;
    }
};

那么在一个程序中,以下是可能的:

int main() {

    A a1;
    a1.print();  // <-- "A"

    B b1;
    b1.print();  // <-- "B"
    
    A* a2 = new B();
    a2->print(); // <-- "B"
}

但是,以下崩溃:

B* b2 = dynamic_cast<B*>(new A());
b2->print(); // <-- Crashes

这里出了什么问题?

解决方法

footer.php 不是从 <footer id="colophon" class="site-footer" role="contentinfo"> <div class="new-row"> <?php do_action( 'storefront_footer1' ); ?> </div> <div class="col-full"> <?php do_action( 'storefront_footer2' ); ?> </div><!-- .col-full --> </footer><!-- #colophon --> 派生的(反之亦然)。您正在创建 A 的实例,而不是 B 的实例。使用 AB 对象转换为 dynamic_cast 指针将导致空指针,您在调用 A 之前不会检查该指针。通过空指针调用非静态类方法是未定义行为,参见:What will happen when I call a member function on a NULL object pointer?

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...