继承和嵌套名称的陷阱

时间:2019-03-23 22:51:45

标签: c++ class oop inheritance name-lookup

在设计项目中的C ++对象继承树时,我遇到了一个特殊的情况。我希望以下内容会失败:

struct A {
    protected:
    struct C { };
};

struct B: A { 
    struct C { };
};

但是,这样编译就可以了。这像一个替代吗?我可以看到这不是很明确,因为可以将它们指定为A::CB::C,但是在多态情况下,这是如何起作用的呢?它会调用指定类型的C还是实例的类型C?像这样,假设下面的代码有效,并且func存在于C的两种实现中:

A x = B();
decltype(x)::C::func();

哪个C的函数会被调用?更笼统地说,它们是描述这些代码段如何解析的资源吗?

1 个答案:

答案 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::CB::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() 

online demo