继承
1、格式
// 基类
class Animal {
// eat() 函数
// sleep() 函数
};
//派生类
class Dog : 访问控制(private/protected/public) Animal {
// bark() 函数
};
2、继承访问控制
1.不能直接拿父亲的私房钱:派生类不能访问基类的私有成员
2.可以问父亲要钱:通过protected/public的成员函数
3.儿子总是比外人亲:派生类可以访问父类的protected成员,其他代码不可以
3、调整访问控制
儿子继承来的财产,他可以捐给别人,也可以私藏(前提:Son看得见这些财产,即不是基类私有的):
Son可见到的成员,Son可以修改它的权限。
private: using Father::getMoney;
4、继承访问控制方式
1.无论哪种继承方式,在派生类内部使用父类时并无差别
2. 不同的继承方式,会影响这两方面:外部代码对派生类的使用、派生类的子类
5、派生类再派生
注意权限问题
6、派生类的函数
如果定义一个和基类一摸一样的函数,会用新的。
7、派生类对象的空间
money 基类部分 (Father)
toy 派生部分 (Son)
如果传入参数不是基类而是派生类,那么会传入派生类的基类部分
void test_func(Person &p)
{
p.printInfo();
}
Person p("lisi", 16);
Student s;
test_func(p);
test_func(s); /* Person &p = s里面的Person部分;
* p引用的是"s里面的Person部分"
*/
例子:
#include <iostream>
using namespace std;
//基类
class A{
public:
A(int a);
int m_a;
public:
void display();
};
A::A(int a):m_a(a) {}
void A::display() {
cout<<"Class A:m_a="<<m_a<<endl;
}
//派生类
class B:public A{
public:
B(int a1,int b);
public:
void display();
protected:
int m_b;
};
B::B(int a, int b):A(a),m_b(b) {}
void B::display() {
cout<<"Class B:m_a="<<m_a<<", m_b"<<m_b<<endl;
}
class C{
public:
C(int c);
public:
void display();
protected:
int m_c;
};
C::C(int c):m_c(c){}
void C::display() {
cout<<"Class C: m_c="<<m_c<<endl;
}
class D:public B,public C{
public:
D(int a,int b,int c,int d);
public:
void display();
private:
int m_d;
};
D::D(int a, int b, int c, int d) :B(a,b),C(c),m_d(d){}
void D::display() {
cout<<"Class D: m_a="<<m_a<<", m_b="<<m_b<<", m_c="<<m_c<<", m_d="<<m_d<<endl;
}
int main(){
A *pa =new A(1); //基类
B *pb =new B(2,20); //从A继承
C *pc =new C(3); //基类
D *pd =new D(4,40,400,4000); //从B C继承
cout<<"-----------------------start"<<endl;
cout<<"pa="<<pa<<endl;
cout<<"pb="<<pb<<endl;
cout<<"pc="<<pc<<endl;
cout<<"pd="<<pd<<endl;
pa=pd;
pa ->display();
pb=pd;
pb ->display();
pc=pd;
pc ->display();
cout<<"-----------------------"<<endl;
cout<<"pa="<<pa<<endl;
cout<<"pb="<<pb<<endl;
cout<<"pc="<<pc<<endl;
cout<<"pd="<<pd<<endl;
return 0;
}