gcc error:'class A'has no member named'b':多態誤用によるエラー


私が学部時代に使っていたプログラミング教材には、「ベースオブジェクトを指すポインタは、そのベースクラスの公有派生クラスオブジェクトを指すことができる(注意は逆に成り立たない)ああ、これは実行時の多態性の基礎です.ベースクラスオブジェクトへのポインタが派生クラスオブジェクトを指すと、派生クラスオブジェクトのベースクラスから継承されたメンバーにアクセスできますが、派生クラスオブジェクト自体が追加したメンバーにはアクセスできません.」
問題をよりよく説明するために、コードを簡単に何行か書きます.私が犯した過ちは赤い字の表記の内容を忘れたことにある.まずa.h:
class A
{
    public:
	int a;

	A();
	virtual ~A();
};

次はa.cppです.
#include "a.h"

A::A()
{
    a = 2;
}

A::~A()
{
}

そしてb.h:
#include "a.h"

class B: public A
{
    public:
	int b;

	B();
	~B();
};

最後にb.cpp:
#include "b.h"

B::B()
{
    a = 0;
    b = 1;
}

B::~B()
{
}

mainを書きます.cppでテスト:
#include <iostream>

#include "a.h"
#include "b.h"

using namespace std;

int main()
{
    A *p1, *p2;

    p1 = new A;
    p2 = new B;

    cout << "A: a = " << p1 -> a << endl;
    cout << "B: a = " << p2 -> a << endl;
    cout << "B: b = " << p2 -> b << endl;

    delete p1;
    delete p2;

    return 0;
}

以下、gccでコンパイル:g++main.cpp a.cpp b.cpp -o main.exe
タイトルに示すように、結果が間違っています.何が原因ですか.前文を読んだことがあるので,みんなはもうはっきりしているので,あまり話さない.