这是与我的previous question相关的后续调查,在该调查中我调查了这个问题,发现在公共继承关系上,上下转换似乎正常工作。例如,此代码甚至无法编译:
class A {
};
class B : protected A {
};
int main() {
B b;
static_cast<A*>(&b);
};
G ++出现以下错误:
t.cc: In function ‘int main()’:
t.cc:10:21: error: ‘A’ is an inaccessible base of ‘B’
10 | static_cast<A*>(&b);
| ^
但是,我认为我发现了以下技巧来克服此限制。 我们可以在类内部进行强制转换,然后将强制转换功能导出为公共方法:
#include <iostream>
class A {
};
class B : protected A {
public:
A* geta() {
return static_cast<A*>(this);
};
static B* fromA(A* a) {
return static_cast<B*>(a);
};
};
int main() {
B b;
// Does not even compile
//std::cout << static_cast<A*>(&b);
// works like charm
std::cout << b.geta() << '\n';
// works also in the reverse direction,although it needs a static method
std::cout << B::fromA(b.geta()) << '\n';
};
我承认这不是很漂亮。我的测试(使用更复杂的代码)显示它可以正常工作,但是我仍然不确定。
这是有效的C ++代码和正确的做法吗?