にゃははー

はへらー

純粋仮想関数が純粋じゃなかった件について

何を言ってるか(ry

struct S
{
	virtual ~S() = 0;
};

のように宣言されている構造体Sのdtorは純粋仮想関数と呼ばれるものだということはご存知でしょう。

これ、関数の本体は書いてなかったのですが、n3225を読んでたら奇妙なexampleが載ってたのでなんというか流石C++さんやーとなったわけです。そのコードが、

struct S
{
	virtual ~S() = 0;
};
S::~S() = default;

????????????????????????
つまり純粋仮想関数なのに本体が定義できるとか抜かしやがるんですよ。ってことは

struct S
{
	virtual ~S() = 0;
};
S::~S() {}

というC++03スタイルでも書けることになります。

コンパイルからリンクまで滞りなく行われるわけで、つまり純粋じゃなかったんですよ。

とはいえ宣言が宣言なので、Sをインスタンス化しようとするとエラーになります。

そして、もう一歩踏み出して驚いたのが、

#include <iostream>

struct S
{
	virtual ~S() = 0;
};
S::~S() { std::cout << "S::~S()" << std::endl; }

struct D : S
{
	~D() { std::cout << "D::~D()" << std::endl; }
};

D d;

というコードはなんと

D::~D()
S::~S()

と呼ばれるのです...

つまり、インスタンス化を牽制しつつデフォルトのdtorを提供できる!!(誰得


こういう発見があるからC++さんは飽きないんですね。