z***e 发帖数: 5393 | 1 被问到一个问题,关于C++的diamond problem,就是class A, 然后B和C都inherit A
,并override A里面的virtual method foo(),然后D inherit B和C
问在D里面怎么用A.foo()? 不准用A::foo()这种.
我败在这上面了...:( |
X****r 发帖数: 3557 | 2 不太理解这个问题。C++里派生类调用已经被override的基类成员不都是这样的吗,
比如B里面用A.foo()不就是A::foo()吗?为什么不准用呢?这个和diamond problem
有什么关系?
A
【在 z***e 的大作中提到】 : 被问到一个问题,关于C++的diamond problem,就是class A, 然后B和C都inherit A : ,并override A里面的virtual method foo(),然后D inherit B和C : 问在D里面怎么用A.foo()? 不准用A::foo()这种. : 我败在这上面了...:(
|
z***e 发帖数: 5393 | 3 他是问D.foo()怎么调A.foo();
我一开始就说用scope operator(那个::是不是叫scope operator?)?他就问不用
scope operator怎么搞,我说那就只能改B和C了,他又说不能动A\B\C...然后我就晕菜
了...
我怀疑电话里面communication出了问题...
【在 X****r 的大作中提到】 : 不太理解这个问题。C++里派生类调用已经被override的基类成员不都是这样的吗, : 比如B里面用A.foo()不就是A::foo()吗?为什么不准用呢?这个和diamond problem : 有什么关系? : : A
|
X****r 发帖数: 3557 | 4 这个不用::不好弄啊,我一时想不出来,也不认为现实中有不能用::的情况。 |
p****o 发帖数: 1340 | 5 B,C里都有一个copy of A。从D来调用这个A.foo()本身就不是一个清楚的问题。。。
A
【在 z***e 的大作中提到】 : 被问到一个问题,关于C++的diamond problem,就是class A, 然后B和C都inherit A : ,并override A里面的virtual method foo(),然后D inherit B和C : 问在D里面怎么用A.foo()? 不准用A::foo()这种. : 我败在这上面了...:(
|
d****i 发帖数: 4809 | 6 这个是不是可以用virtual class来保证D只用一个共同的copy of A啊?但是从D调用A
的foo似乎还是得用A::foo()。
【在 p****o 的大作中提到】 : B,C里都有一个copy of A。从D来调用这个A.foo()本身就不是一个清楚的问题。。。 : : A
|
K*****n 发帖数: 65 | 7 class D: public virtual B, public virtual C, public A
{
...
((A*)this)->foo();
}; |
H****r 发帖数: 2801 | 8 dynamic_cast?
A
【在 z***e 的大作中提到】 : 被问到一个问题,关于C++的diamond problem,就是class A, 然后B和C都inherit A : ,并override A里面的virtual method foo(),然后D inherit B和C : 问在D里面怎么用A.foo()? 不准用A::foo()这种. : 我败在这上面了...:(
|
d********u 发帖数: 5383 | 9 C++里的这个东西早就公认是失败的设计了.你应该高兴不用跟这种垃圾浪费生命.
A
【在 z***e 的大作中提到】 : 被问到一个问题,关于C++的diamond problem,就是class A, 然后B和C都inherit A : ,并override A里面的virtual method foo(),然后D inherit B和C : 问在D里面怎么用A.foo()? 不准用A::foo()这种. : 我败在这上面了...:(
|
t****t 发帖数: 6806 | 10 OP said "diamond problem", which means A is virtual base. there is only 1
copy of A.
【在 p****o 的大作中提到】 : B,C里都有一个copy of A。从D来调用这个A.foo()本身就不是一个清楚的问题。。。 : : A
|
|
|
t****t 发帖数: 6806 | 11 first, if both B and C override a virtual function foo(), but D did not, the
program is ill-formed anyway. so if both B and C override foo(), D must
also override foo().
Using foo(), this->foo(), or ((A*)this)->foo() are all equivalent since this
always points to an object D, with final overrider D::foo(). so your method
is wrong.
【在 K*****n 的大作中提到】 : class D: public virtual B, public virtual C, public A : { : ... : ((A*)this)->foo(); : };
|
b****t 发帖数: 112 | 12 That is terrible design.
If it's their real code dealing with that, good luck surviving bug fixes. My
previous company ran into the same issue and no one was ever happy about
that.
A
【在 z***e 的大作中提到】 : 被问到一个问题,关于C++的diamond problem,就是class A, 然后B和C都inherit A : ,并override A里面的virtual method foo(),然后D inherit B和C : 问在D里面怎么用A.foo()? 不准用A::foo()这种. : 我败在这上面了...:(
|
m****u 发帖数: 3915 | 13 我知道有个可行
A * a = new A()
a->foo();
哈哈 |
r*******y 发帖数: 290 | 14 who is still using multiple inheritance?
A
【在 z***e 的大作中提到】 : 被问到一个问题,关于C++的diamond problem,就是class A, 然后B和C都inherit A : ,并override A里面的virtual method foo(),然后D inherit B和C : 问在D里面怎么用A.foo()? 不准用A::foo()这种. : 我败在这上面了...:(
|
a****n 发帖数: 1887 | 15 dynamic_cast, 或者 ((A*)this)->foo(); |
S**I 发帖数: 15689 | 16 do you know what "virtual" means?
【在 a****n 的大作中提到】 : dynamic_cast, 或者 ((A*)this)->foo();
|
d****p 发帖数: 685 | 17 OP was tricked: this is a trap question for personality test.
OP should just tell the interviewer this question is misleading and the
correct answer is A::foo
A
【在 z***e 的大作中提到】 : 被问到一个问题,关于C++的diamond problem,就是class A, 然后B和C都inherit A : ,并override A里面的virtual method foo(),然后D inherit B和C : 问在D里面怎么用A.foo()? 不准用A::foo()这种. : 我败在这上面了...:(
|
B*****t 发帖数: 335 | 18 可以用object slicing,这样会产生A的一个临时变量。什么公司问这么无聊的问题。
用A::foo()多好!
D d;
((A)d).foo()
A
【在 z***e 的大作中提到】 : 被问到一个问题,关于C++的diamond problem,就是class A, 然后B和C都inherit A : ,并override A里面的virtual method foo(),然后D inherit B和C : 问在D里面怎么用A.foo()? 不准用A::foo()这种. : 我败在这上面了...:(
|
h*******u 发帖数: 15326 | 19 A是纯虚的还有招么?
。
【在 B*****t 的大作中提到】 : 可以用object slicing,这样会产生A的一个临时变量。什么公司问这么无聊的问题。 : 用A::foo()多好! : D d; : ((A)d).foo() : : A
|
B*****t 发帖数: 335 | 20 当然可以,只要A define了foo()
【在 h*******u 的大作中提到】 : A是纯虚的还有招么? : : 。
|
|
|
h*******u 发帖数: 15326 | 21 A是纯虚,怎么产生临时变量的?
【在 B*****t 的大作中提到】 : 当然可以,只要A define了foo()
|
B*****t 发帖数: 335 | 22 sorry, 想当然了! A是纯虚不能产生临时变量,you are right. thinks!!!
【在 h*******u 的大作中提到】 : A是纯虚,怎么产生临时变量的?
|
h*******u 发帖数: 15326 | 23 我刚也试了试,g++ 4.4.1不通过。呵呵
【在 B*****t 的大作中提到】 : sorry, 想当然了! A是纯虚不能产生临时变量,you are right. thinks!!!
|
h*****0 发帖数: 4889 | 24 这个……你A型临时变量foo()了,原来这个对象还是啥都没得到啊。
。
【在 B*****t 的大作中提到】 : 可以用object slicing,这样会产生A的一个临时变量。什么公司问这么无聊的问题。 : 用A::foo()多好! : D d; : ((A)d).foo() : : A
|