基类与派生类之间可以相互转换,具体有以下几种情况:
1,派生类对象可以向基类对象赋值:
A a1;
B b1;
a1 = b1;
这是把b1中关于类A部分的成员赋给了a1,。
注意只能用派生类对象对基类对象进行赋值,不能反过来。
2,派生类对象可以向基类对象的引用赋值或者初始化:
A a1;
B b1;
A & r = b1;
或者:
A & r = a1;
r = b1;
注意r 此时并不是b1 的别名,也不是与b1同享同一段存储单元,它只是b1中基类部分的别名。r 与b1具有相同的起始地址。
3,如果函数的参数是基类的对象或者基类的引用,那么相应的实参可用子类对象:
与前相同,输出类B的对象b1 只能输出派生类中基类成员的值。
4,指向基类对象的指针变量可以用来指向派生类对象:
#include<iostream>
using namespace std;
class Base
{
public :
Base(int m):a(m){}
void display()
{
cout<<"a="<<a<<endl;
}
private:
int a;
};
class Drived:public Base
{
public :
Drived(int m,int n):Base(m)
{b = n;}
void display()
{
Base::display();
cout<<"b="<<b<<endl;
}
private:
int b;
};
void main()
{
Base *pt;
Drived dri(1,2);
pt = &dri;
pt -> display();
}
在派生类中有两个同名的display成员函数,根据同名覆盖的规则,被调用的应该是派生类Drived对象的display函数,但是实际运行结果确是调用了基类的display成员函数,原因在于pt是指向Base类对象的指针变量,即使让它指向了dri,但实际上pt指向的是dri从基类继承的部分,结论如下:
通过指向基类对象的指针,只能访问派生类中的基类成员,而不能访问派生类增加的成员。