私がこのようなものを持っているとき:
class A
{
virtual void rat();
};
class B : public A
{
virtual void rat() { ; } //implemented!
};
int main(int argc, char **argv)
{
A *a = new B;
delete a;
}
リンカーエラーが発生します:
ベースラットを純粋な仮想にしない限り。
しかし、私がこれを持っているとき:
class A
{
public:
void rat();
};
int main(int argc, char **argv)
{
A a;
}
これは正常にコンパイルされ、main()でrat関数を明示的に呼び出そうとしない限り、未定義の参照リンクエラーは発生しませんa.rat();
。実装されていない基本クラスの仮想関数のルールは何ですか?ただし、最初の失敗したコードスニペットのように派生クラスに実装されていますか?