问题描述
让父类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
的实例。使用 A
将 B
对象转换为 dynamic_cast
指针将导致空指针,您在调用 A
之前不会检查该指针。通过空指针调用非静态类方法是未定义行为,参见:What will happen when I call a member function on a NULL object pointer?