当前,我正在学习动态转换,因此我正在测试各种代码段。
我测试了下面的代码是否带有(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)
答案 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_cast
是pb
(静态类型),因为通常*B
无法转换为*B
,因为两种类型完全无关。
但是鉴于*A
(动态类型)的多重继承,可以将其强制转换为*D
。这就是为什么这里需要*A
的原因:跟踪pb指向的对象的原始D类型。并且这要求该类至少具有如上所述的虚函数。