目录
公有继承
- 设计类Base具有public, protected, private等不同属性的成员函数或变量
class Base {
public:
int a=1;
protected:
int b=2;
private:
int c=3;
};
2.使用public继承Base类,子函数在使用public继承Base类时,子函数内部可以访问到protected部分,外部只能访问到public部分(在公有继承中,基类的公有成员和保护成员可被访问且访问属性不变,而私有成员不可以直接访问)
class Pub_Base :public Base {
public:
void Test() {
a = 1;
b = 2;
/*c=3无法访问*/
}
int pub_b1 = 4;
private:
int pub_b2 = 10;
protected:
int pub_b3 = 20;
};
结果展示:
说明:Pub_Base在public继承Base类时,只能继承Base的public部分及自己定义的public成员
私有继承
概念:当类的继承方式为私有继承时,基类中的公有成员和保护成员都以私有成员身份出现在派生类中,而基类的私有成员不可直接访问
class Pri_Base :private Base {
public:
void test() {
a = 1;
b = 2;
/*c=3不能访问*/
}
int pri_b1 = 6;
protected:
int pri_b2 = 7;
private:
int pri_b3 = 8;
};
结果展示:
结果说明:在私有继承中,基类的公有和保护乘员被继承后都作为派生派的私有成员,派生派的其他成员可以直接访问他们,但是在类族外部通过派生派的对象无法直接访问他们。
保护继承
概念:保护继承中,基类的公有和保护成员都以保护成员的身份出现在派生类中,而基类的私有成员不可直接访问。
class Pro_Base :protected Base {
public:
void test() {
a = 1;
b = 2;
/*c=3无法访问*/
}
int pro_b1 = 11;
protected:
int pro_b2 = 21;
private:
int pro_b3 = 22;
};
结果展示:
结果说明:以protected方式继承的外部不能访问到public成员,只能访问到自己定义的public成员
3.B以private方式继承A,尝试把A中的部分public成员提升到public
class NewPrivate_Base :private Base{
public:
void test() {
a = 67;
b = 76;
}
int pri_b1 = 100;
using Base::a; /*using作用:在子类中引用基类成员,NewPrivate_Base私有继承类Base,所以不能直接访问public成员,用using后可以在main函数中引用public成员a*/
protected:
int pri_b2 = 200;
private:
int pri_b3 = 300;
};
结果说明:使用using后可以在main函数中访问到基类函数的public成员
友元类继承
友元函数可以访问类的私有成员,不需要类的对象去驱动
1.设计类A含有私有变量a,在类A中友元给类C
class A {
public :
int a = 97;
protected:
int b = 95;
private:
int c = 92;
friend class C;
};
2.设计类B继承A,添加私有变量b;在类C中测试访问类B的成员变量a,b
/*类B继承A*/
class B :public A {
private:
int b = 94;
};
/*在C中测试访问类B的成员a,b*/
class C {
public :
void test(){
B b1;
b1.a;
A a1;
a1.c; /*因为类A友元给类C,所以在类C中可以访问到A的私有成员变量*/
}
};
3.设计类D继承C,在类D的成员函数中测试访问类A的成员变量a,类B的成员变量a,b
/*在D中测试类A的成员a,类B的成员a,b*/
class D :public C {
public :
void test() {
A a1;
a1.a;
/*友元关系不能被继承,即:朋友可以继承,朋友的儿子则不可以继承*/
B b1;
b1.a;
}
};
结果展示:
总结:
公有继承
如果采用公用继承,基类的公有成员和保护成员的访问属性在派生派中不变,而基类的私有成员不可直接访问
私有继承
如果采用私有继承,1.派生派可以访问保护成员。2.外部使用者无法访问保护成员
保护继承
1.受保护成员可以被派生类的成员函数引用。2.所有基类的成员都成为派生类的私有成员或不可直接访问的成员。3.如果进一步派生,基类的全部成员就无法在新的派生中被直接访问
友元类:
1.友元类不能被传递。2.友元关系是单向的,不具有交换性(若B是A的友元,A不一定是B的友元,要看是否有相应声明)3.友元关系不具有传递性
时间有点赶,所以多态性的综合运用得晚几天再学呜呜呜呜~~~~