我发现Swift的init方法中的动态方法调度与C ++中的不同,有谁解释原因?
这是演示代码及其输出:
在斯威夫特:
class Object {
init() {
a()
}
func a() {
print("Object")
}
}
class SubObject: Object {
override init() {
}
override func a() {
print("SubObject")
}
}
let a = SubObject()
// output: SubObject
在C ++中:
class Object {
public:
Object() {
a();
}
virtual void a() {
std::cout << "Object" << std::endl;
}
};
class SubObject: public Object {
public:
SubObject() {
}
virtual void a() {
std::cout << "SubObject" << std::endl;
}
};
int main(int argc, const char * argv[]) {
SubObject s;
return 0;
}
// output: Object
正如您所看到的,上面用Swift和C ++编写的代码几乎相同,但它们的输出完全不同,而Swift似乎找到了覆盖方法并调用派生方法,C ++仍称为超级方法。
在LearnCpp处,它说:
不要从构造函数或析构函数中调用虚函数这是另一个经常捕获毫无疑问的新程序员的问题。您不应该从构造函数或析构函数中调用虚函数。为什么呢?
请记住,在创建Derived类时,首先构造Base部分。如果您要从Base构造函数调用虚函数,并且尚未创建该类的Derived部分,则它将无法调用该函数的Derived版本,因为Derived函数没有Derived对象可以工作上。 在C ++中,它将调用Base版本。
析构函数存在类似的问题。如果在Base类析构函数中调用虚函数,它将始终解析为函数的Base类版本,因为类的Derived部分已经被销毁。