求解 c++中三种继承方式的区别!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求解 c++中三种继承方式的区别!相关的知识,希望对你有一定的参考价值。

求解 区别

public公有继承

protected保护继承

private私有继承

我们知道类的private和protected成员,在类外是不可以使用的.只有public成员可以在类外直接使用.

公有继承时,基类的private成员派生类也不可用,基类的public和protected成员在派生类中可直接使用.继承过来(变成派生类相应的public和protected成员)只有public成员在派生类外可以直接使用.

保护继承时,基类的private成员仍为有私有.基类的public和protected成员变成派生类的protected成员,这时在派生类外也不能直接使用原基类的public成员

私有继承时,基类的private成员仍为有私有.基类的public和protected成员将变成派生类的private成员.

举个例子.

class A

public:

   int m_nTelNum;

protected:

   int m_nAge;

private:

   int m_nMoney;

;

class B:public A

   void SetTelNum(int nTelNum)

   

       m_nTelNum=nTelNum;

   

   void SetAge(int nAge)

   

       m_nAge=nAge;

   

   void SetMoney(int nMoney)

   

       m_nMoney=nMoney;//这里就出现错误,因为基类的private成员不能用.

   

;

B objB;//创建B类的对象objB

objB.m_nTelNum=123456;//可以

objB.m_nAge=30;//错误.public继承中基类的protected在派生类中是protected

objB.m_nMoney=100;//更错误,在派生类中都不可以直接使用.在类外就更不能了.

class C:protected A

   void SetTelNum(int nTelNum)

   

       m_nTelNum=nTelNum;

   

   void SetAge(int nAge)

   

       m_nAge=nAge;

   

   void SetMoney(int nMoney)

   

       m_nMoney=nMoney;//这里就出现错误,因为这是基类的private成员不能用.

   

;

C objC;//创建C类的对象objC

objC.m_nTelNum=123456;//注意这里和public的区别,这里错误,m_nTelNum变成了C类的protected成员

objC.m_nAge=30;//错误.protected继承中基类的protected在派生类中是protected,这与public同相

objC.m_nMoney=100;//更错误,在派生类中都不可以直接使用.在类外就更不能了.

class D:private A

   void SetTelNum(int nTelNum)

   

       m_nTelNum=nTelNum;

   

   void SetAge(int nAge)

   

       m_nAge=nAge;

   

   void SetMoney(int nMoney)

   

       m_nMoney=nMoney;//这里就出现错误,因为这是基类的private成员不能用.

   

;

D objD;//创建D类的对象objD

objD.m_nTelNum=123456;//错误,m_nTelNum变成了D类的private成员

objD.m_nAge=30;//错误.private继承中基类的protected在派生类中是private

objD.m_nMoney=100;//更错误,在派生类中都不可以直接使用.在类外就更不能了.

从例子来看,三种继承从派生类内部引用来看好像没有区别,只在类外引用时表现不同.现在还看不出public和protected继承的区别

那再看一个例子.

class E:public B

   void SetTelNum(int nTelNum)

   

      m_nTelNum=nTelNum;//可以 因为这是B的公有成员

   

   void SetAge(int nAge)

   

      m_nAge=nAge;//可以 因为这是B的保护成员,现成变成E的protected成员

   

   void SetMoney(int nMoney)

   

      m_nMoney=nMoney;//这个肯定不可以!

   

;

E objE;//

objE.m_nTelNum=123456;//可以

//其它的两个就不能用了.

class F:public C

   

   void SetTelNum(int nTelNum)

   

      m_nTelNum=nTelNum;//可以 因为这是C的保护成员,这里与public继承已经有区别但还没有表现出来

   

   void SetAge(int nAge)

   

      m_nAge=nAge;//可以 因为这是C的保护成员,现成变成E的protected成员

   

   void SetMoney(int nMoney)

   

      m_nMoney=nMoney;//这个肯定不可以!

   

;

F objF;

objF.m_nTel=123456;//错误,因为这是F的保护成员.注意与E类区别

class G:public D

   void SetTelNum(int nTelNum)

   

      m_nTelNum=nTelNum;//不可以 因为这是D的private成员,注意这里区别

   

   void SetAge(int nAge)

   

      m_nAge=nAge;//不可以 因为这是D的private成员,注意区别

   

   void SetMoney(int nMoney)

   

      m_nMoney=nMoney;//这个肯定不可以!

   

;

//那G在类外就没有了可以引用的继承过来成员了!

//这些继承方式是很难理解的.最好的办法就是多写代码去试.

参考技术A 公用(public):访问权限最高;除派生类外,外部函数也可以直接访问(无论是成员变量还是成员函数)。
私有(private):访问权限最低;只能是该类内部函数互相调用,派生类、外部函数都不能访问。
保护(protect):访问权限中间;该类内部函数、派生类都能访问,外部类、外部函数不能访问

我们这样来记会更加容易一些,在继承时:

1、不管采用哪种形式(public, protected或private),基类中的私有成员都不可以被继承;如果非要在派生类中使用基类的私有成员,可以有两种方法:一是使用属性,二是使用友元类或友元函数。

2、如果采用public形式,则基类除了私有成员的其它所有都被原样的继承到派生类中;即在基类中是public的,在派生类中还是public的,在基类中是protected的,在派生类中还是protected的。

3、如果采用protected形式,则基类中除了私有成员的其它说有都被以protected的形式继承到派生类中。
C++中的继承方式有:
public、private、protected三种(它们直接影响到派生类的成员、及其对象对基类成员访问的规则)。
(1)public(公有继承):继承时保持基类中各成员属性不变,并且基类中private成员被隐藏。派生类的成员只能访问基类中的public/protected成员,而不能访问private成员;派生类的对象只能访问基类中的public成员。
(2)private(私有继承):继承时基类中各成员属性均变为private,并且基类中private成员被隐藏。派生类的成员也只能访问基类中的public/protected成员,而不能访问private成员;派生类的对象不能访问基类中的任何的成员。
(3)protected(保护性继承):继承时基类中各成员属性均变为protected,并且基类中private成员被隐藏。派生类的成员只能访问基类中的public/protected成员,而不能访问private成员;派生类的对象不能访问基类中的任何的成员。
参考技术B 公用(public):访问权限最高;除派生类外,外部函数也可以直接访问(无论是成员变量还是成员函数)。
私有(private):访问权限最低;只能是该类内部函数互相调用,派生类、外部函数都不能访问。
保护(protect):访问权限中间;该类内部函数、派生类都能访问,外部类、外部函数不能访问
参考技术C

如图

js中三种定义变量的方式const, var, let的区别。

const   var  let区别

1.const 定义的变量不可以修改,而且必须初始化

const  a = 3;正确

const a;错误,必须初始化

console.log("函数外const定义a:"+"a");    有值输出;

console.log("函数外修改const定义a"+"a");   无法输出

 

2.var 定义的变量可以修改,如果不初始化会输出undefine

var a = 1;

console.log("函数外var定义a:+"a");

function   change(){

a =2;

console.log("函数内var定义a:+"a");

}

change();

console.log("函数调用后var定义a为函数内部修改值:+"a");

 

3.let是块级作用域,函数内部使用let定义后,对外部函数无影响

let c = 3;

console.log("函数外let定义c:"+"c");

function change(){

let c =6;

console.log("函数内let定义c:" + "c");

}

change();

console.log(“函数调用let定义c不受函数内部定义影响:”+“c”)

 

以上是关于求解 c++中三种继承方式的区别!的主要内容,如果未能解决你的问题,请参考以下文章

Qt中三种解析xml的方式

Android中三种常用解析XML的方式(DOMSAXPULL)简介及区别

VMware中三种网络连接的区别

VMware中三种网络连接的区别

VMware中三种网络连接的区别

带你掌握C++中三种类成员初始化方式