不是多态类型,或者为什么我们在这里需要虚拟析构函数?

时间:2019-03-23 11:55:10

标签: c++ polymorphism virtual multiple-inheritance dynamic-cast

当前,我正在学习动态转换,因此我正在测试各种代码段。

我测试了下面的代码是否带有(2)中标记的虚拟析构函数,发现只有在第(2)行存在时,第(3)行才是正确的。没有它,代码将无法编译。但为什么?有趣的是,似乎根本不需要第(1)行。

struct A {
    virtual ~A() = default; \\ (1)
};
struct B {
    virtual ~B() = default; \\ (2)
};
struct D : A, B {};

B* pb = new D();
A* pa = dynamic_cast<A*>(pb); \\ (3)

1 个答案:

答案 0 :(得分:0)

一般

dynamic_cast需要确定运行时的行为。根据所投射对象的真实类型,该对象将返回from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import re #... wait = WebDriverWait(driver, 10) for i in range(10): str_points = wait.until(EC.visibility_of_element_located((By.CLASS_NAME, "fs18"))).text print("str_points: " + str_points) points = re.search("\\d+", str_points)[0] if int(points) > 9: break wait.until(EC.element_to_be_clickable((By.CLASS_NAME, "skip_button_single"))).click() //time.sleep(8) print(f'{points} Points! Go for it!') 或目标类型的有效指针。

要在运行时完成此操作,C ++实现需要访问其他一些information about the type at run-time。并且管理此信息需要执行一些其他操作。开销很小,但确实存在。

并非总是需要动态铸造。 C ++语言设计人员已决定,如果不需要,则不创建不必要的开销。因此,除非您说需要多态性,否则编译器将尝试在编译时尽可能解决所有类型问题。

需要多态性和动态类型的方法是在类中具有至少一个虚拟成员函数

您的具体情况

如果您在程序中非常清楚源对象的类型与目标对象的类型兼容,则可以按照here的说明使用nullptr

但这不适用于您的情况,因为static_castpb(静态类型),因为通常*B无法转换为*B,因为两种类型完全无关。

但是鉴于*A(动态类型)的多重继承,可以将其强制转换为*D。这就是为什么这里需要*A的原因:跟踪pb指向的对象的原始D类型。并且这要求该类至少具有如上所述的虚函数。