我读本科时候所用的程序设计教材上有这么一句话:“指向基类对象的指针可以指向该基类的公有派生类对象(注意反过来不成立),这是运行时多态性的基础。指向基类对象的指针指向派生类对象后,可以访问派生类对象中由基类继承下来的成员,但不能访问那些派生类对象自己增加的成员。”
为了更好地说明问题,简单写几行代码。我犯的错误就在于忘记了红字标注的内容。首先是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
结果报错,如标题所示。什么原因?读过前文,大家都已经清楚了,就不多说了。