当我继续继承和上/下铸造时,我偶然发现了这个问题。为什么不允许(代码被注释为显示不允许的部分)?现在我可以猜测为什么它不被允许,但事实上的答案会很好。受保护/私有继承铸造
至于那允许的代码,我知道那是因为(基地*)是C样式转换本质上是一个的reinterpret_cast在C++这反过来又意味着,在这种情况下,它会导致未定义的行为。如果我错了,请纠正我。
class Base
{
};
class Derived : public Base
{
};
class DerivedProt : protected Base
{
};
class DerivedPriv : private Base
{
};
int main()
{
Base* a = new Derived();
Base* b = new DerivedProt(); // Not allowed
Base* c = new DerivedPriv(); // Not allowed
Base* d = (Base*) new DerivedProt(); // Allowed but undefined behavior...?
Base* e = (Base*) new DerivedPriv(); // Allowed but undefined behavior...?
}
即使它不是未定义的行为,它仍然是一个令人难以置信的坏主意,应该避免。这种转换非常危险的一件事是,即使没有继承关系并且甚至不会产生警告,编译器也会尝试去做。 – 2011-03-20 23:11:09
我不得不在线查看Comeau,看看我的编译器是否得到了这个错误。不,reinterpret_cast <>也可以这样做。 – 2011-03-21 00:31:54
@HansPassant但是'reinterpret_cast'不知道或关心基类。它不能用于向上或向下演员。 – curiousguy 2011-12-19 16:05:52