规则一:
派生类的对象可以给基类对象赋值(因为在继承的时候c继承了父类的信息,可以在进行了对象切片后给子类中相应的父类信息段赋值)
eg:
class base
{
public:
base(){}
~base(){}
public:
int x;
};
class D : public base
{
public:
D(){}
~D(){}
public:
int y;
};
int main()
{
D d;
base b;
b = d; //用父类对象给派生类对象赋值,反过来不可以
return 0;
}
规则二:
可以将一个派生类的对象的地址赋值给其基类的指针变量;
并且只能通过该指针访问派生类中的由基类继承来的隐藏对象,不能访问派生类的新成员;
eg:
class base
{
public:
base(){}
~base(){}
public:
void show(){}
public:
int x;
};
class D : public base
{
public:
D(){}
~D(){}
public:
void show(int){}
void print(){}
public:
int y;
};
int main()
{
D d;
base b;
base *pb;
pb = &d;
pb->show(); //此处访问的是父类的show方法(因为用的是父类的指针,所以只能访问父类的信息)
pb->show(2); //错误,因为父类没有带参数的show()方法
}
规则三:
派生类对象可以初始化基类的引用; 引用就是一个别名;
并且这个别名只能包含派生类对象中由父类继承来的隐藏对象
class base
{
public:
base(){}
~base(){}
public:
void show(){}
public:
int x;
};
class D : public base
{
public:
D(){}
~D(){}
public:
void show(int){}
void print(){}
public:
int y;
};
int main()
{
D d;
base b;
base &pb = d; //派生类对象初始化基类的引用
pb.show(); //访问的是父类的show方法
}
要想让其调用子类的方法就要在父类中将与子类的同名同参数,同返回值的方法加virtual关键字就可以调用子类的方法(也就是多态)
class base
{
public:
base(){}
~base(){}
public:
virtual void show(){}
public:
int x;
};
class D : public base
{
public:
D(){}
~D(){}
public:
void show(int){}
void print(){}
public:
int y;
};
int main()
{
D d;
base b;
base *pb;
pb = &d;
pb->show(); //调用的是子类的show方法(有了多态)
base &bf = d;
bf.show(); //调用的是子类的show方法(多态)
}