当我进行继承和上/下投射时,我意外地遇到了这个问题。为什么不允许这样做(代码被注释以显示不允许的部分)?现在我可以猜测为什么不允许它,但事实答案会很棒。
至于允许 的代码,我知道这是因为(Base *)是一个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...?
}
答案 0 :(得分:6)
标准明确指定C样式强制转换可以执行此转换。这是C风格演员可以做的唯一演员,但没有C ++演员可以做到。据我所知,结果并非未定义;任何其他演员都不允许这样做。
答案 1 :(得分:1)
听起来你是对的。
要记住的一件事是传统的OO原则(如LSP)仅描述公共继承。非公共继承属于继承和组合之间,基础子对象是非公共组合,但您也可以利用依赖继承的功能,例如虚函数。
就像组合的子对象一样,只有类(或者它的后代,在受保护的继承的情况下)才能获得子对象的地址。