我非常肯定我理解了向上转换和向下转换之间的一般区别,尤其是在C ++中。 我明白,我们不能总是downcast,因为将基类指针投射到派生类指针会假定指向的基类对象具有派生类的所有成员。 在这个学期的初期,我的教授告诉全class学生,在C ++中有时候也是非法的,但是我似乎错过了在笔记里为什么不记得什么时候发生的事情。 任何人都可以告诉我什么时候在C ++中使用upcast是非法的?
Haskell中的代数数据types (ADT)可以通过从它们派生出来自动成为一些类的实例(如Show , Eq )。 data Maybe a = Nothing | Just a deriving (Eq, Ord) 我的问题是,这是如何deriving工作,即如何Haskell知道如何实现派生types派生ADT的function? 另外,为什么只能deriving到某些特定的类? 为什么我不能写我自己的派生类可以派生?
鉴于任何容器types,我们可以形成(以元素为中心的)拉链,并知道这个结构是一个Comonad。 这是最近探讨在另一个堆栈溢出问题的以下types的精彩细节: data Bin a = Branch (Bin a) a (Bin a) | Leaf a deriving Functor 用下面的拉链 data Dir = L | R data Step a = Step a Dir (Bin a) deriving Functor data Zip a = Zip [Step a] (Bin a) deriving Functor instance Comonad Zip where … Zip是一个Comonad虽然它的实例有点多毛。 也就是说, Zip可以从Tree完全机械地派生出来,并且(我相信)以这种方式派生的任何types都自动成为Comonad ,所以我觉得应该是这样的,我们可以一般地自动构造这些types和它们的连接器。 […]
我正在使用指向对象的向量。 这些对象是从一个基类派生的,并被dynamic地分配和存储。 例如,我有这样的东西: vector<Enemy*> Enemies; 我将从Enemy类派生,然后为派生类dynamic分配内存,如下所示: enemies.push_back(new Monster()); 什么是我需要注意的事情,以避免内存泄漏和其他问题?