在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;
}