f********a 发帖数: 165 | 1 在constructor里调用virtual function:
c++
struct A
{
A()
{
x();
}
virtual void x()
{
cout<<"A"<
}
};
struct B: public A
{
B()
{
x();
}
void x()
{
cout<<"B"<
}
};
int main()
{
B b;
A* a = new B;
a->x();
}
A
B
A
B
B
如果是java的话: b b b b b
哪位解释下为何c++里是用的父类的而在java里用的子类的。 |
G***l 发帖数: 355 | 2 因为在C++里,constructor执行完之前,object还不算存在。x = new B()会先调用A的
contructor,这时候x还不知道自己是B,那个vtable也没有建立,所以根本就无从调用B
的方法,就算你那个方法声明是virtual的,也没法dynamic binding,只能调用A里的。
java在没有执行A constructor的时候,类似c++ vtable的那些东西都已经建立好了。
所以能调用到B的方法。
但是不管在c++还是java里,constructor里调用virtual method都是很糟糕的东西,绝
对不应该做,面试的人问这个很脑残。
【在 f********a 的大作中提到】 : 在constructor里调用virtual function: : c++ : struct A : { : A() : { : x(); : } : virtual void x() : {
|
f********a 发帖数: 165 | 3 多谢。是个老毛子,边问边喝伏特加,面完喝完,最后瓶子都留在桌子上。也怪自己学
艺不精。
你的意思是说c++里面最后调用完A的constructor,A的vtable和b的vtable都没建立好,
所以只能用A自己的virtual function?
java里面也是需要建立vtable的?那有没有vpointer一说?为什么在没有执行的时候类
似vtable的东西都已经建好?
用B
的。
【在 G***l 的大作中提到】 : 因为在C++里,constructor执行完之前,object还不算存在。x = new B()会先调用A的 : contructor,这时候x还不知道自己是B,那个vtable也没有建立,所以根本就无从调用B : 的方法,就算你那个方法声明是virtual的,也没法dynamic binding,只能调用A里的。 : java在没有执行A constructor的时候,类似c++ vtable的那些东西都已经建立好了。 : 所以能调用到B的方法。 : 但是不管在c++还是java里,constructor里调用virtual method都是很糟糕的东西,绝 : 对不应该做,面试的人问这个很脑残。
|
p****U 发帖数: 109 | 4 2L 应该是对的。 c++ 先call base class constructor 然后 再call derived class
。 java 就不懂了。 |
a**********t 发帖数: 631 | 5 Totally agree. Calling virtual function in constructor is bad coding
practice.
用B
的。
【在 G***l 的大作中提到】 : 因为在C++里,constructor执行完之前,object还不算存在。x = new B()会先调用A的 : contructor,这时候x还不知道自己是B,那个vtable也没有建立,所以根本就无从调用B : 的方法,就算你那个方法声明是virtual的,也没法dynamic binding,只能调用A里的。 : java在没有执行A constructor的时候,类似c++ vtable的那些东西都已经建立好了。 : 所以能调用到B的方法。 : 但是不管在c++还是java里,constructor里调用virtual method都是很糟糕的东西,绝 : 对不应该做,面试的人问这个很脑残。
|
d**********x 发帖数: 4083 | 6 not just bad.. it is undefined behavior in c++...
用A的
了。
,绝
【在 a**********t 的大作中提到】 : Totally agree. Calling virtual function in constructor is bad coding : practice. : : 用B : 的。
|
w**z 发帖数: 8232 | 7 all mthods in Java are virtual.
class
【在 p****U 的大作中提到】 : 2L 应该是对的。 c++ 先call base class constructor 然后 再call derived class : 。 java 就不懂了。
|
s********n 发帖数: 53 | 8 java 里面
class A {
A() {
x();
}
void x() {
System.out.println("A");
}
}
class B extends A {
B() {
x();
}
void x() {
System.out.println("B");
}
}
public class Test {
public static void main(String[] args) {
B b;
A a = new B();
a.x();
}
}
Output:
B
B
B |
s***e 发帖数: 403 | 9 所以我说了很多遍
做C++的OOP一定要读Inside C++ Object Model这本书。
有基础的话1天就能读完,以我这种非CS背景的当年大三一个星期也读完了。然后所有
的继承啊多态啊对你就没有任何理解障碍了。 |
d**********x 发帖数: 4083 | 10 aglee
【在 s***e 的大作中提到】 : 所以我说了很多遍 : 做C++的OOP一定要读Inside C++ Object Model这本书。 : 有基础的话1天就能读完,以我这种非CS背景的当年大三一个星期也读完了。然后所有 : 的继承啊多态啊对你就没有任何理解障碍了。
|