C++でポリモーフィックなクラスのコピーコンストラクタや代入演算子をprivateにしておくべき理由

趣味で書いてるプログラムの構造を考えていた時に
ふと「あれ?なんでポリモーフィックなクラスって値型にしちゃいけないんだっけ?」
って思い出せなかった(老化、ボケ)ので、備忘録として書いておく。
つーか自分の中であまりにも定石と化してしまって、
そういうクラスが必要な時は普段はpimplで実装してしまっていたので、
特殊な縛りの条件化で「あれ、これってなんでこうしてるんだっけ?」ってなるのはヤバイよな(--;


理由は一言「スライシングが起こるから」だ。
今回想定してたクラスにはメンバ変数がなくて、仮想関数だけ上書きしたかったんだが、
サブクラスにメンバ変数を宣言させないように制限する方法はC++には無いし、
そもそもコピーコンストラクタはどう考えても、vptr(vtableを指しているポインタ)は右手側からコピーしないから、
今回想定している用途には使えない。
そういえば代入演算子ではvptrはどうなるんだろう?まあ永遠に使わないので気にしなくてもいいか。


で、よく考えたら今想定している用途(メンバ変数いらん、仮想関数だけのクラスが欲しい)には
普通の関数ポインタを使えばいいのだ。
一個で足りないなら関数ポインタを複数持った構造体を使えばいいのだ。
そうだった。うっかりしてた。
やっぱり歳だ。