由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 问问C++的diamond problem
相关主题
friend function 不能virtual 怎么搞呢?How to understand the answer.
ask a C++ inheritance questionOverridden function will cause function shadow in C++, but not in Java
about multiple inheritance问一个C++问题:default parameter and overriding/inheritanc (转载)
How to check the virtual function table size?几个C++书写风格疑问
A C++ inheritance question!还请教一个关于C++的问题
C++ 请教: about the memory layout of the class inheritanceoverride operator[] inline
问题:vptr/vtable for virtual function & vptr/vtable for请教 C++的一个困惑 (operator delete)
C++ private inheritance. v.s. composition问题
相关话题的讨论汇总
话题: foo话题: c++话题: virtual话题: diamond话题: override
进入Programming版参与讨论
1 (共1页)
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

相关主题
C++ 请教: about the memory layout of the class inheritanceHow to understand the answer.
问题:vptr/vtable for virtual function & vptr/vtable forOverridden function will cause function shadow in C++, but not in Java
C++ private inheritance. v.s. composition问一个C++问题:default parameter and overriding/inheritanc (转载)
进入Programming版参与讨论
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是纯虚的还有招么?
:
: 。

相关主题
几个C++书写风格疑问请教 C++的一个困惑 (operator delete)
还请教一个关于C++的问题问题
override operator[] inlineScala的operator似乎不太好读
进入Programming版参与讨论
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

1 (共1页)
进入Programming版参与讨论
相关主题
问题A C++ inheritance question!
Scala的operator似乎不太好读C++ 请教: about the memory layout of the class inheritance
两个看来相似的问题问题:vptr/vtable for virtual function & vptr/vtable for
protected class member in C++C++ private inheritance. v.s. composition
friend function 不能virtual 怎么搞呢?How to understand the answer.
ask a C++ inheritance questionOverridden function will cause function shadow in C++, but not in Java
about multiple inheritance问一个C++问题:default parameter and overriding/inheritanc (转载)
How to check the virtual function table size?几个C++书写风格疑问
相关话题的讨论汇总
话题: foo话题: c++话题: virtual话题: diamond话题: override