在设计项目中的C ++对象继承树时,我遇到了一个特殊的情况。我希望以下内容会失败:
struct A {
protected:
struct C { };
};
struct B: A {
struct C { };
};
但是,这样编译就可以了。这像一个替代吗?我可以看到这不是很明确,因为可以将它们指定为A::C
和B::C
,但是在多态情况下,这是如何起作用的呢?它会调用指定类型的C还是实例的类型C?像这样,假设下面的代码有效,并且func
存在于C的两种实现中:
A x = B();
decltype(x)::C::func();
哪个C的函数会被调用?更笼统地说,它们是描述这些代码段如何解析的资源吗?
答案 0 :(得分:4)
这很好,因为您有两个不相关的 col1 col2 col3 col4 col5 col6
0 0.001 -4.053424 0.0 0.0 0.0 0
1 0.001 -3.654581 0.0 0.0 0.0 0
:一个是struct C
,另一个是B::C
。 B::A::C
只是他们的快捷方式名称。
如果您在每个C中都定义了静态函数f(),则可以从结构外部调用它,而无需任何对象,如代码所示:
C
为了完整起见,下面是一个更完善的示例,该示例显示一点都没有歧义:
A a = B(); // the type of a is A (B is sliced, by the way)
decltype(a)::C::f(); // so this calls A::C::f()