#include<iostream>
using namespace std;
class Base
{
public:
Base():x(0)
{}
~Base()
{}
public:
void show()
{
cout<<"This is Base"<<endl;
}
void show(int)
{
cout<<"This is Base(int)"<<endl;//函数的重载概念
}
private:
int x;
};
class D:public Base
{
public:
D():y(0)
{}
~D()
{}
public:
void print()
{
cout<<"This D print()"<<endl;
}
void show()
{
cout<<"This is D show()"<<endl;
}
public:
void list()
{
cout<<"This is D list()"<<endl;
}
private:
int y;
};
/*
void main()
{
D d;
d.print();
d.show();//子类有show 父类也有show 但是调动子类 这叫子类同名隐藏
//d.show(0);这个错误
d.Base::show(0);//必须加限定 不然子类的方法会隐藏掉所有的父类的同名方法
//这块表示为如果不加Base::限定,错误会显示无法找到有参数的show 方法
}
*/
void main()
{
D d;
Base b=d;//这块之后调动的也只能是父类的方法
b.show();
b.show(0);
}
/*
void main()
{
Base b;
D d;
Base *pb;
//1
b=d;//子类能够给父类赋值,但是父类是不可以给子类赋值
//2
pb=&d;//Base * D*
pb->show();
pb->show(0);
// pb->list(); pb智能通过这个指针访问派生类中由基类继承来放入隐藏对象,不能访问派生类中的新成员
Base &bf=b;
bf.show();
bf.show(0);
// bf.list(); 不管是引用或者指针对于以上的函数调用都是一样 只能在父类中
}
*/
派生与基类:
在任何需要基类对象的地方都可以死用公有派生类的对象来代替,这条规则称 赋值兼容规则。它包括以下情况:
1- 派生类的对象可以赋值给基类的对象,这时把派生类对象中,从对应基类中继承来的隐藏对象赋值给基类对象。反过来不行,因为派生类的新成员五值可赋。
2-可以将一个派生类的对象的地址赋给其基类的指针变量,但只能通过这个指针访问派生类中由基类继承来的隐藏对象,不能访问派生类中的新成员。同样也不能反过来做。
3-派生类对象可以初始化基类的引用。引用是别名,但这个别名只能包含派生类对象中的由基类继承来的隐藏对象。