>>172
std::shared_ptr<(IFooの派生クラス)> pObj(new (IFooの派生クラス)()) ならそもそもsumの方こそ仮想関数でなくても良い
std::shared_ptr<IFoo> pObj(new (IFooの派生クラス()) ならデストラクタが仮想でないとマズー

仮想関数有りかつ非仮想デストラクタ、を許すC++のこの仕様の理由をゼロオーバーヘッドの原則で説明くのであれば
仮想関数有りかつ非仮想デストラクタ、を許すことで得られる性能上のメリットが指摘されねばならない