转换为基类有效性

jma*_*erx 6 c++ polymorphism casting

假设我有一个名为的类Base和一个派生自它的类SuperBase.鉴于add接受a Base*,其中任何一个都是有效的:

SuperBase *super = new SuperBase;
bases.add(super);
Run Code Online (Sandbox Code Playgroud)

要么

SuperBase *super = new SuperBase;
bases.add((Base*)super);
Run Code Online (Sandbox Code Playgroud)

GMa*_*ckG 9

第一个作品只要通过从派生到基础的隐式转换SuperBase公开衍生Base:

struct base { virtual ~base() {} };
struct derived : base {};

base* b = new derived; // okay
Run Code Online (Sandbox Code Playgroud)

第二个也有效,但忽略了对Base以下内容的保护:

struct derived : private base {}; // private base

base* b = new derived; // not okay, base is private
base* b = (base*)(new derived); // okay, but gross
Run Code Online (Sandbox Code Playgroud)

如果是的话private,你可能不应该投它.

  • 但那不是真的!(至少在C++ 03中).C风格转换为无法访问的基础**保证正常工作(即好像基地可访问).结果指针是指向"Base"类型的基类子对象的有效指针,它可以安全地使用.即C风格的强制转换在这种情况下不是`reinterpret_cast`,而是忽略保护的`static_cast`.当然,它仍然是一个糟糕的编程习惯,因为它忽略了保护,但它"有效".为什么你说这种行为是不确定的? (3认同)