考虑以下这段 C++ 代码:
#include <iostream>
using namespace std;
struct B {
virtual int f() { return 1; }
int g() { return 2; }
};
struct D1 : public B { // (*)
int g() { return 3; }
};
struct D2 : public B { // (*)
virtual int f() { return 4; }
};
struct M : public D1, public D2 {
int g() { return 5; }
};
int main() {
M m;
D1* d1 = &m;
cout << d1->f()
<< static_cast<D2&>(m).g()
<< static_cast<B*>(d1)->g()
<< m.g();
}
它会打印出1225
。如果我们使用虚继承,即在标有(*)的行中在public
之前添加virtual
,则会打印4225
。
- 能否解释一下为什么
1
变成了4
? - 能否解释一下
static_cast<D2&>(m)
和static_cast<B*>(d1)
的意义? - 你如何避免在这种组合中迷失方向?你画图了吗?
- 正常项目中是否常见遇到这样复杂的设置?
g()
函数的更好方法是删除static_cast
,并分别使用m.D2::g()
和d1->B::g()
。 - iammilind