将派生类转换为基础

时间:2015-12-14 14:02:46

标签: c++

这里发生什么类型的演员表({{​​1}})?

B::get()

我在着名的API中看到过这种代码。做class A { public: A() : a(0) {} int a; }; class B : public A { public: A* get() { return this; //is this C-style cast? } }; int main() { B b; cout << b.get()->a << "\n"; system("pause"); return 0; } 是否更好?

2 个答案:

答案 0 :(得分:10)

这是标准的派生到基指针转换。规则是如果Dconst,则指向具有volatile / BB条件的D的指针可以转换为指向static_cast的指针,具有相同的限定符基类this.controllerFor('application')

标准转换是具有内置含义的隐式转换,是与moduleFor('route:application', 'Unit | Route | application', { needs: ['service:session', 'controller:application'] }); test('delete record validation returns false if order item delete and update order item widget open', function(assert) { assert.expect(1); let route = this.subject(); let controller = route.controllerFor('application'); controller.set('rightSidebarWidgets', [{ name: 'widgets/add-update-order-item' }]); assert.notOk(route.deleteRecordValidation('orderItem')); }); 或C风格转换等内容分开的概念。

通常情况下,最好尽可能依赖隐式转换。显式转换会增加更多代码噪音,并可能隐藏一些维护错误。

答案 1 :(得分:3)

它是对祖先的隐式转换。隐式转换通常是安全的,他们不能做static_cast无法做到的事情。它们实际上更受限制:您可以使用static_cast进行未经检查的向下转发,但不能使用隐式转换。