C++ 受保护/私有继承转换

C++ 受保护/私有继承转换,c++,inheritance,C++,Inheritance,我在研究继承和上/下转换时意外地遇到了这个问题。为什么不允许这样做(注释代码以显示不允许的部分)?现在我可以猜到为什么这是不允许的,但是一个真实的答案会很好 对于允许的代码,我知道是因为(Base *)是C样式的转换,它本质上是C++中的“强> ReRealtTyPase,这意味着在这种情况下,它将导致未定义的行为。如果我错了,请纠正我 class Base { }; class Derived : public Base { }; class DerivedProt : protected

我在研究继承和上/下转换时意外地遇到了这个问题。为什么不允许这样做(注释代码以显示不允许的部分)?现在我可以猜到为什么这是不允许的,但是一个真实的答案会很好

对于允许的代码,我知道是因为<强>(Base *)<强>是C样式的转换,它本质上是C++中的“强> ReRealtTyPase,这意味着在这种情况下,它将导致未定义的行为。如果我错了,请纠正我

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...?
}

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

听起来你是对的

需要记住的一点是,传统的OO原则(如LSP)只描述公共继承。非公共继承介于继承和组合之间,基本子对象是类似于非公共的组合,但您也可以利用依赖于继承的功能,例如虚拟函数


但是,与组合子对象一样,只有类(或其后代,在受保护继承的情况下)才能获取子对象的地址。

即使它不是未定义的行为,这仍然是一个非常糟糕的主意,应该避免。此强制转换非常危险的一点是,即使没有继承关系,编译器也会尝试执行此操作,甚至不会生成警告。我必须与Comeau online进行检查,以查看我的编译器是否出错。不,reinterpret\u cast也可以这样做。@HansPassant但是
reinterpret\u cast
不知道或者不关心基类。它不能用于上下转换。