Redian新闻
>
简单装修问题及求推荐法拉盛换地板跟刷油的师傅 (转载)
avatar
简单装修问题及求推荐法拉盛换地板跟刷油的师傅 (转载)# Living
f*a
1
在constructor里调用virtual function:
c++
struct A
{
A()
{
x();
}
virtual void x()
{
cout<}
};

struct B: public A
{
B()
{
x();
}
void x()
{
cout<}
};

int main()
{
B b;
A* a = new B;
a->x();
}

A
B
A
B
B
如果是java的话: b b b b b
哪位解释下为何c++里是用的父类的而在java里用的子类的。
avatar
I*d
2
【 以下文字转载自 NewYork 讨论区 】
发信人: Imsocold (Imsocold), 信区: NewYork
标 题: 简单装修问题及求推荐法拉盛换地板跟刷油的师傅
发信站: BBS 未名空间站 (Wed Mar 13 13:39:35 2013, 美东)
公寓里有地板但是踩起来有点响,所以想换,一般都是自己去home depot买好地板然后
找师傅装就可以了吗?750尺 大概要多长时间可以换完?还有就是想把墙粉刷一下,天
棚有些不平,坑坑洼洼的要弄平。大概这两项各需要多少钱多少时间?第一次装修所以
请明白人指教一下 谢谢啦!!!!
avatar
G*l
3
因为在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()
: {

avatar
t*e
4
好像2刀一尺,光工钱。
你多打些电话问问吧。
就是地板平,作的细致为好,不要图省钱。
刷漆无所谓吧。

【在 I******d 的大作中提到】
: 【 以下文字转载自 NewYork 讨论区 】
: 发信人: Imsocold (Imsocold), 信区: NewYork
: 标 题: 简单装修问题及求推荐法拉盛换地板跟刷油的师傅
: 发信站: BBS 未名空间站 (Wed Mar 13 13:39:35 2013, 美东)
: 公寓里有地板但是踩起来有点响,所以想换,一般都是自己去home depot买好地板然后
: 找师傅装就可以了吗?750尺 大概要多长时间可以换完?还有就是想把墙粉刷一下,天
: 棚有些不平,坑坑洼洼的要弄平。大概这两项各需要多少钱多少时间?第一次装修所以
: 请明白人指教一下 谢谢啦!!!!

avatar
f*a
5
多谢。是个老毛子,边问边喝伏特加,面完喝完,最后瓶子都留在桌子上。也怪自己学
艺不精。
你的意思是说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都是很糟糕的东西,绝
: 对不应该做,面试的人问这个很脑残。

avatar
s*h
6
同求推荐
avatar
p*U
7
2L 应该是对的。 c++ 先call base class constructor 然后 再call derived class
。 java 就不懂了。
avatar
a*t
8
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都是很糟糕的东西,绝
: 对不应该做,面试的人问这个很脑残。

avatar
d*x
9
not just bad.. it is undefined behavior in c++...

用A的
了。
,绝

【在 a**********t 的大作中提到】
: Totally agree. Calling virtual function in constructor is bad coding
: practice.
:
: 用B
: 的。

avatar
w*z
10
all mthods in Java are virtual.

class

【在 p****U 的大作中提到】
: 2L 应该是对的。 c++ 先call base class constructor 然后 再call derived class
: 。 java 就不懂了。

avatar
s*n
11
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
avatar
s*e
12
所以我说了很多遍
做C++的OOP一定要读Inside C++ Object Model这本书。
有基础的话1天就能读完,以我这种非CS背景的当年大三一个星期也读完了。然后所有
的继承啊多态啊对你就没有任何理解障碍了。
avatar
d*x
13
aglee

【在 s***e 的大作中提到】
: 所以我说了很多遍
: 做C++的OOP一定要读Inside C++ Object Model这本书。
: 有基础的话1天就能读完,以我这种非CS背景的当年大三一个星期也读完了。然后所有
: 的继承啊多态啊对你就没有任何理解障碍了。

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。