继承的写法---继承和派生的区别
/*父类必须是存在的 先准备一个类*/
class 父类名
{
};
//子类 继承方式就是权限限定词
class 子类名:继承方式 父类名
{
};
继承--->所产生的子类中没有新的属性、行为--->所有东西都是父类中的
//父类
class parent
{
};
//子类
class son1:public parent
{
};
派生(与继承区别不大、与继承写法一样)--->派生类中有新的属性、行为产生--->与继承的区别:子类的表现(有新的属性|行为)、专业术语不同(父类|基类)
//基类
class parent
{
};
//派生类
class son1:public parent
{
};
三种继承方式
//公有继承
class son1:public parent
{
public:
protected:
};
//保护继承
class son2:protected parent
{
public:
protected:
};
//私有继承
class son3:private parent
{
public:
protected:
};
继承的实质
父类的数据和成员在子类中有一份
例子:继承下来的私有属性不能直接访问,但是可以间接通过父类的函数访问
//父类
class parent
{
public:
void print()
{
cout << name << "\t" << money << endl; //父类中的行为
}
string& getWife() //提供公有接口做访问
{
return wife; //继承中的私有属性,能够被继承,但是不能访问
}
protected:
string name; //父类中的属性
int money;
private:
string wife; //小知识: 子类中能不能直接访问父类中私有属性的wife? 不能
};
//子类 继承父类的属性&行为
class son :public parent
{
public:
void printSon()
{ //继承父类的属性、行为--->父类的属性要通过父类构造函数初始化
print(); //在子类没有写行为,但是可以调用父类中的函数
cout << name << "\t" << money << endl;
//在子类中没有写属性,但是可以打印父类的数据
//cout << wife << endl; //父类中私有属性不能直接访问
cout << getWife() << endl; //可以间接通过父类的函数(公有接口)访问
}
protected:
};
int main()
{
son boy;
boy.printSon();
}
/*输出*/
-858993460
-858993460 没有写构造函数初始化父类属性,输出是乱码
继承的权限问题(类外对父类属性的权限显示)
继承方式只会增强父类属性在子类中的权限显示
父类中的属性在子类中的权限
继承方式 | 子类中的权限 | public | protected | private |
---|---|---|---|
public继承 | public | protected | 不可直接访问 |
protected继承 | protected(父类的public属性增强为protected属性) | protected | 不可直接访问 |
private继承 | private | private | 不可直接访问 |
-
这个表格描述的是:父类的属性在子类中能否直接访问 ,间接都可以访问<--->直接访问,部分继承没办法直接访问
-
无论是什么继承方式,父类中的私有属性在子类中都是不可直接访问<--->能间接通过父类函数(接口)访问(上面内容<继承的实质> 已举例说明)子类的私有属性与父类无关(子类的私有属性在子类中可以访问)
-
保护继承|私有继承,意味着 在子类中的所有属性 最低权限为保护属性|私有属性
-
对私有继承和私有属性的特别说明:不可访问指的是父类的私有属性不能直接访问,并不是说子类的私有属性不能直接访问
class A
{
public:
int a1;
protected:
int a2;
private:
int a3;
};
//公有继承
class B :public A
{
/*公有继承产生子类 继承就相当于在子类中定义了3个变量,这3个变量分别是这些属性*/
public:
//int a1;
protected:
//int a2;
private:
//int a3; 采用公有继承,a3能被继承,展示为私有属性,但是不能直接访问
};
//保护继承
class C :protected A
{
public:
protected:
//int a1; //public属性显示为protected属性
//int a2;
private:
//int a3; 采用公有继承,a3能被继承,但是不能直接访问
};
//私有继承
class D :private A
{
public:
void print()
{
cout << a1 << endl;
cout << a2 << endl; //继承下来的属性权限为私有,在类中自己还是可以访问的
//cout << a3 << endl;//报错:父类的私有属性不能直接访问,其他属性可以访问
}
protected:
private:
//int a1; //私有继承:父类中的属性在子类中的权限全部是私有属性
//int a2;
//int a3; 采用公有继承,a3能被继承,但是不能直接访问
};
int main()
{
B b;
b.a1 = 123; //a1继承下来后,在子类中的权限是公有类型,类外是可以访问公有类型的
C c;
//c.a1 = 12; //报错:父类中的a1已经在当前子类中转换为保护属性,没办法直接访问
return 0;
}
保护属性和私有属性的区别(继承中有区别)
-
一旦一个类被私有继承后,这个类继承下来后没有办法延续下去,"断子绝孙"
-
私有继承会导致当前父类无法在孙子类中有任何作用
-
想让一个类只产生一个子类,不产生子类的子类,一般用私有继承
//父类
class A
{
public:
int a1;
protected:
int a2;
private:
int a3;
};
//私有继承
class D :private A
{
public:
void print()
{
cout << a1 << endl;
cout << a2 << endl;
//cout << a3 << endl;
}
protected:
private:
//int a1;
//int a2;
//int a3;
};
class F :public D //D类产生F类
{
public:
/*A类中的属性在D类中已经全部转换为私有的--->对于A类的属性不能再使用了,传不下来了
A类中的所有东西在F类没有任何效果了*/
};
小知识:
为什么要知道&了解权限 ?
要知道类外对象怎么访问成员、能不能访问成员、类中能不能使用这个成员.