【发布时间】:2016-08-03 19:33:44
【问题描述】:
在转换引用时,编译器似乎试图将 Derived 类转换为其 Base 并且根本不使用自定义转换。不过,这可以完美地使用指针。
例子:
#include <iostream>
class Base {
public:
int fn() {
return 42;
}
};
class Derived : private Base {
public:
operator Base&() {
return *dynamic_cast<Base*>(this);
}
operator Base*() {
return dynamic_cast<Base*>(this);
}
};
int main() {
Derived d;
Derived &dRef = d;
std::cout<<static_cast<Base&>(dRef).fn()<<std::endl; // <-- error: non-reachable base >>Base<< of >>Derived<<
std::cout<<static_cast<Base*>(d)->fn()<<std::endl; // OK -> "42"
}
为什么不能像这样使用自定义演员表?是否有可能实现预期的行为(“向上转换”到带有引用的不可访问的基础)?
【问题讨论】:
-
你会注意到你的基类是 private 故意的,是吗?
-
@WhozCraig 这是有意的,因此我们需要演员阵容。不过它确实适用于指针。
-
好吧,前者(引用)无论如何都不会被调用,你的编译器应该已经警告过你:clang,例如:“转换函数将'Derived'转换为其基类'Base ' 永远不会被使用”。
-
我试图理解为什么可以使用指针而不是引用来转换它。
标签: c++ templates inheritance casting reference