using namespace std;
class BaseA {
private:
int a;
int funA3() { cout << "A3" << endl; }
public:
void funA() { cout << " funA" << endl; }
int getA1() { return a; }
protected:
int getA2() { funA3(); getA1(); }
};
class pbA :public BaseA
{
private:
int b;
public:
void funB() { cout << " funB" << endl; }
void funB1() { funA(); getA2(); getA1(); } //可以访问基类的公有和保护成员,但私有成员只能通过方法访问。
};
class C :private BaseA
{
private:
int c;
public:
void funC() { cout << " funC" << endl; }
void funC1() { funA(); getA1(); getA2(); }//基类的公有和保护都变为私有,私有不能调用
};
class C3 :private C {
public:
void funC3() { funC(); funC1();}
//内部调用只能使用第二代的函数,因为第一代方法的在第二代成为私有。想要调用只能通过第二代的方法调用第一代的
};
class D :protected BaseA {
private:
int d;
public:
void funD() { funA();getA1(); getA2(); }//基类的公有和保护都变为保护,私有不能调用
};
class D3 :protected D {
public:
void funD3() { funA(); getA1(); getA2(); funD(); }
//内部可以调用第二代,第三代的方法
};
int main()
{
//此处a对象只能访问公有的函数,其它私有和保护不能被外界访问,
//私有和保护只能类内访问(自用),即类内的函数可以调用私有和保护成员
//封装特性,暴露外界的只有公有部分。
BaseA a;
a.funA();
a.getA1();
//a.funA3(); //
//a.getA1(); 均不能访问
cout << "=================================================" << endl;
//公有继承,基类的公有为派生类的公有,私有只能通过基类的公有方法和保护方法访问
//基类的保护为派生类的保护,因此也只能内部使用(即派生类的内部函数调用私有和保护)
pbA pb;
pb.funA();
// pb.a; //不能直接访问基类的a,只能通过基类的保护和公有方法访问
// pb.getA2();不能直接访问基类的保护成员,因为 它是保护的,外界看不到
pb.getA1();
a = pb;//可以隐式向上转换, is-a关系。
cout << "=================================================" << endl;
//私有继承,基类的公有为派生类的私有,保护为派生的保护,私有只能通过基类的公有和保护访问。
C c;
c.funC();
c.funC1(); //只能调用这几种,私有继承的全为私有,类外不可访问,只能在派生类的内部自用。
//a = c; //不能隐式向上转换
cout << "=================================================" << endl;
//保护继承,基类公有和保护都成为派生的公有和保护,私有只能通过基类的公有和保护访问。
D d;
d.funD();//只能调用这几种,类外不可访问,只能在派生类的内部自用。
//a = d; //能隐式向上转换,但只能在派生类中
cout << "=================================================" << endl;
//注意:使用私有继承,第三代将不能使用基类的接口,因为第二代将基类的公有变成私有,第三代中第一代为私有的私有
//第三代的对象不能使用 基类的方法,只能在自己的内部使用。
C3 c3;
c3.funC3(); //只能调用自己的
//使用保护继承,基类的公有接口在第二代为保护,到了第三代依然是保护,可以使用。
D3 d3;
d3.funD3(); // 只能调用自己的
}
C++中三种继承关系以及访问权限
最新推荐文章于 2022-05-30 20:43:45 发布
本文探讨了C++中的继承概念,包括公有、私有和保护继承,以及它们如何影响基类成员在派生类中的访问权限。示例展示了不同继承方式下,派生类如何访问基类的公有、保护和私有成员,强调了封装和继承在面向对象编程中的重要性。
摘要由CSDN通过智能技术生成