在C# (Java)中在构造函数中调用虚函数(被子类重载的),当创建子类实例时,会发生奇怪的现象:子类的函数被调用了。
而在C++中只会调用父类的函数。举例说明:
// Java
class CBase {
public CBase() {
init();
}
public void init() {
System.out.println("base init");
}
};
class Derived extends CBase {
public Derived(){
}
public void init() {
System.out.println("derived init.");
}
};
public class Main {
public static void main(String[] args) {
new Derived();
// 输出 derived init.
}
}
// C++
class CBase {
public:
CBase() {
init();
}
virtual void init() {
puts("base init");
}
};
class Derived : public CBase {
public:
Derived(){
}
virtual void init() {
puts("derived init.");
}
};
int main() {
Derived obj;
// 输出 base init.
return 0;
}
本文探讨了在C#和C++中构造函数内调用虚函数的行为差异。通过具体示例展示了Java中子类构造函数会调用被重写的虚函数,而C++则仅调用基类的虚函数。

358

被折叠的 条评论
为什么被折叠?



