【发布时间】:2019-03-23 22:51:45
【问题描述】:
我在项目中设计 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 会调用它们的函数?更一般地说,它们是描述像这样的代码 sn-ps 如何解析的资源吗?
【问题讨论】:
-
您的示例将
x创建为具有A类型(并切片B以对其进行初始化)。在下一条语句中,x是通过切片B来初始化的,这无关紧要,因为它的类型是A。所以decltype(x)::C::func()将解析为A::C::func()(然后根据使用的访问控制和上下文进行编译或不编译)。 -
@彼得。这就说得通了。如果
A x = B();改为B x = B(); A &y = x;会怎样?这也会导致切片吗? -
B x = B()不会导致切片(它相当于B x没有临时[假设复制对象会创建一个相等的对象等])。y将能够访问A::C但不能访问B::C。给定对A的引用,编译器没有任何信息允许它隐式访问B中的任何名称,即使引用的对象实际上是B。给定B(或对B的引用),B中的名称C将名称C隐藏在A中 - 只能使用特定范围访问AsC(如B::C或B::A::C或(在B的成员内)A::C)。 -
@Peter 这就是我所期待的。谢谢:)
-
运行时多态性在...运行时起作用。名称在编译时绑定。类型名称没有运行时多态性。
标签: c++ class oop inheritance name-lookup