1.保持已有类的特性而构造新类的过程称为继承。
2.在已有类的基础上新增自己的特性而产生新类的过程称为派生。
3.被继承的已有类称为基类(或父类)。
4.派生出的新类称为派生类(或子类)。
概念及工作方式
继承的目的:实现代码重用。
派生的目的:当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程序进行改造。
继承(代码重用 )
#include <iostream>
using namespace std;
class Shop
{
public:
int m_a;
void saleDailyGoods()
{
m_a=40;
cout<<"卖日用品"<<m_a<<endl;
return ;
}
};
class Market:public Shop//继承:代码重用
{
public:
void saleFood()
{
m_a=10;
cout<<"食品"<<m_a<<endl;
return;
}
};
class Supermarket:public Market
{
public:
void pay()
{
cout<<"代缴水费"<<m_a<<endl;
return;
}
};
int main()
{
Supermarket m;
m.saleDailyGoods();
m.saleFood();
m.pay();
return 0;
}
运行结果:
卖日用品40
食品10
代缴水费10
————————————————————————————————————————————————————————————————————————————
继承的访问权限
class Base�
{�
public:�
int m1;�
protected:�
int m2;�
private:�
int m3;�
};�
class PrivateClass:private Base //私有继承�
{�
public:�
void test()�
{�
ml=1; //ok:将m1据为private�
m2=2; //ok:将m2据为private�
m3=3; //不可访问�
}�
};�
class DerivedFromPri:public PrivateClass�
{ �
public:�
void test()�
{�
m1=1; //不可访问基类的私有成员�
m2=2; //不可访问�
m3=3; //不可访问�
}�
};
class ProtectedClass:protected Base //保护继承�
{�
public:�
void test()�
{�
m1=1; //ml据为protected�
m2=2; //m2据为protected�
m3=3; //不可访问�
}�
};�
class DerivedFromPro:public ProtectedClass�
{�
public: �
void test()�
{�
m1=1; //ml 仍为protected�
m2=2; //m2 仍为protected�
m3=3; //不可访问�
}�
};
#include <iostream>
using namespace std;
class B0
{
public:
void display()
{
cout<<"B0 display"<<endl;
}
};
class B1:public B0//可以调用B0
{
public:
void display()
{
cout<<"B1 display"<<endl;
}
};
class D1:public B1//可以调用B0,B1
{
public:
void display()
{
cout<<"D1 display"<<endl;
}
};
int main()
{
B0 b0;
b0.display();
B1 b1;
b1.display();
D1 d1;
d1.B0::display();
d1.B1::display();
d1.display();
return 0;
}
运行结果:
B0 display
B1 display
B0 display
B1 display
B1 display
多态(基类指针指向子类对象 )
#include <iostream>
using namespace std;
class B0
{
public:
void display()
{
cout<<"B0 display"<<endl;
}
};
class B1:public B0//可以调用B0
{
public:
void display()
{
cout<<"B1 display"<<endl;
}
};
class D1:public B1//可以调用B0,B1
{
public:
void display()
{
cout<<"D1 display"<<endl;
}
};
int main()
{
B0 b0,*p0;//多态:基类指针指向子类对象
p0=&b0;
p0->display();
B1 b1;
p0=&b1;
p0->display();
D1 d1;
p0=&d1;
p0->display();
return 0;
}
运行结果:
B0 display
B0 display
B0 display
纯虚函数(virtual)
#include <iostream>
using namespace std;
class B0
{
public:
virtual void display()=0;//纯虚函数,下面的函数一定要重写
};
class B1:public B0//可以调用B0
{
public:
void display()
{
cout<<"B1 display"<<endl;
}
};
int main()
{
B0 *p0;
B1 b1;
p0=&b1;
p0->display();
}
多继承(不建议使用)
#include <iostream>
using namespace std;
class Father
{
public:
void money ()
{
cout<<"有钱"<<endl;
}
};
class Mother
{
public:
void face ()
{
cout<<"漂亮,高挑"<<endl;
}
};
class Son:public Father,public Mother//多继承
{
};
int main()
{
Son s;
s.money();
s.face();
}
运行结果:
有钱
漂亮,高挑
虚函数 ,用在菱形继承结构
#include <iostream>
using namespace std;
class Person
{
public:
int id;
};
class Father:virtual public Person//虚函数 ,用在菱形继承结构
{
public:
void money ()
{
cout<<"有钱"<<endl;
}
};
class Mother:virtual public Person
{
public:
void face ()
{
cout<<"漂亮,高挑"<<id<<endl;
}
};
class Son:public Father,public Mother//多重继承
{
public:
void aa()
{
cout<<id<<endl;
}
};
int main()
{
Son s;
s.money();
s.id=3;
Person*p=&s;
s.aa();
Mother m;
m.id=5;
m.face();
}
运行结果:
有钱
3
漂亮,高挑5