受保护/私有继承强制转换

时间:2011-03-20 22:44:42

标签: c++ inheritance

当我进行继承和上/下投射时,我意外地遇到了这个问题。为什么不允许这样做(代码被注释以显示不允许的部分)?现在我可以猜测为什么不允许它,但事实答案会很棒。

至于允许 的代码,我知道这是因为(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...?
}

2 个答案:

答案 0 :(得分:6)

标准明确指定C样式强制转换可以执行此转换。这是C风格演员可以做的唯一演员,但没有C ++演员可以做到。据我所知,结果并非未定义;任何其他演员都不允许这样做。

答案 1 :(得分:1)

听起来你是对的。

要记住的一件事是传统的OO原则(如LSP)仅描述公共继承。非公共继承属于继承和组合之间,基础子对象是非公共组合,但您也可以利用依赖继承的功能,例如虚函数。

就像组合的子对象一样,只有类(或者它的后代,在受保护的继承的情况下)才能获得子对象的地址。