28.【C++ 继承与派生 (详解)】(一)

简介: 28.【C++ 继承与派生 (详解)】

(一)、什么是继承与派生

(1).继承是自然界一个普遍的重要特性,源于人们对客观世界的认识。(狗和黑狗的特性)一般到特殊的关系.

(2).继承机制,就是在一个已存在的类(父类)的基础上建立一个新的类,这个新的类**(子类)自动拥有已有类的全部成员的一种机制**,进而体现出层次性.(下层是上层的特殊类)

(3).继承是类之间定义的一种重要关系,已有类A的基础上定义类B,类B会自动得到类A的函数成员和数据成员,使得程序员只需在类B定义类A中所没有的新成分就柯完成在类B的定义,

在这种情况下,就称类B继承了类A,类A派生了类B,A是基类(父类),B是派生类(子类),这种机制叫做继承

(二)、为什么要使用继承和派生?

类的继承和派生机制使程序员无需修改已有的类,只需在既有类的基础上,根据问题的实际需要,通过增加部分代码或修改少量代码而得到的新的类(派生类),从而解决了程序代码的重用问题.

(三)、继承方式

公有继承,私有继承,保护继承,

如果缺省:就是声明的时候继承方式是空的,那就默认为是按照私有继承方式继承.

(四)、继承的属性

(1).继承基类的成员函数和数据成员
 (2).增加新的数据成员和成员函数.
 (3).重载或重新定义继承自基类的成员函数
 (4).改变基类成员在派生类中的访问属性

1.添加新的数据成员和成员函数

#include <iostream>
using namespace std;
class Base    
{
private:
  int x;
public:
  void setX(int i)
  {
    x=i;
  }
  void show()
  {
    cout<<"x="<<x<<endl;
  }
};
class Drevid: public Base  
{
public:
    void show1()     //添加成员函数
  {
    cout<<"LWT love Lwt"<<endl;
  }
};
int main()
{
  Base b;
  b.setX(10);
  b.show();
  Drevid d;
  d.setX(20);   //  改变成员   
  d.show(); //继承成员              
  d.show1();                           
  return 0;
}

2.覆盖改变成员

#include <iostream>
using namespace std;
class Base                                      //基类
{
private:
  int x;
public:
  void setX(int i)
  {
    x=i;
  }
  void show()
  {
    cout<<"x="<<x<<endl;
  }
};
class Drevid: public Base                
public:
  void show1()
  {
    cout<<"我喜欢!"<<endl;
  }
  void show()                           
  {
    cout<<"喜欢我!"<<endl;
  }
};
int main()
{
  Base b;
  b.setX(10);
  b.show();
  Drevid d;
  d.setX(20);                            
  d.show(); //覆盖              
  d.show1();
  return 0;

(五)、继承方式和派生类的访问权限

(1).公有继承(公私保变公私保)

最常见的继承方式,基类的public成员仍然作为派生类的public成员;基类中的privat成员被隐藏(使得派生类内部也变得不可以直接访问私有成员)。虽然不能够直接访问基类的private成员,但可通过从基类的公有成员访问派生类的对象可以访问基类中的非private成员;

派生类的对象只能访问基类中的public成员

(2).保护继承(公私保全变保)

派生类的内部,基类的公有成员和保护成员均作为派生类的保护成员,派生类的成员可以直接访问它们,而派生类的成员无法访问基类的私有成员。

保护继承时基类中各成员属性均变为protected,并且基类中private成员被隐藏。派生类的成员只能访问基类中的public/protected成员,而不能访问private成员;派生类的对象不能访问基类中的任何的成员

1.本类内部: 可以访问基类的public/private

2.本类的对象: 不能访问基类的任何成员

3.本类的派生类内部: 可以访问基类的public/private

4.本类的派生类对象: 不能访问基类的任何成员

派生类的外部:派生类的成员和派生类的对象均无法访问基类的全部成员

如果基类只进行了一次派生,则保护继承和私有继承的功能完全相同,但保护继承可以进一步派生,而私有继承则不可以.

(3).私有继承:(公私保变私)

基类中的private被隐藏,在派生类的内部,基类的公有成员和保护成员作为派生类的私有成员,派生类的成员可以直接访问基类中(公有和保护),而派生类的对象无法访问基类的任何成员

私有继承之后,全部基类成员在派生类中都成为了私有成员或不可访问的成员,进一步派生后,将再也无法直接访问

派生类对象不能访问基类中的任何的成员函数

(六)各种实列

1.【公有继承下派生类通过公有成员访问私有成员】

#include <iostream>
using namespace std;
class Base                                      
{
private:
  int x;
public:
  void setX(int i)
  {
    x=i;
  }
  void show()
  {
    cout<<"x="<<x<<endl;
  }
  int getX()      //共有返回私有
  {
    return x;
  }
};
class Drevid: public Base                  
{
public:
  void display()
  {
    cout<<"x="<< getX()<<endl;      //访问基类中的私有
  } 
};
int main()
{
  Base b;
  b.setX(10);
  b.show();
  Drevid d;
  d.setX(20);
  d.display();
  return 0;
}

2.【公有继承下派生类通过公有成员访问保护成员】

#include <iostream>
using namespace std;
class Base
{
protected:     //保护
  int x;
public:
  void setX(int i)
  {
    x = i;
  }
  void show()
  {
    cout << "x=" << x << endl;
  }
  int getX()      //共有返回保护
  {
    return x;
  }
};
class Drevid : public Base
{
public:
  void display()
  {
    cout << "x=" << getX() << endl;      //访问基类中的保护
  }
};
int main()
{
  Base b;
  b.setX(10);
  b.show();
  Drevid d;
  d.setX(20);
  d.display();   
  return 0;
}

3.【私有继承下类外不能访问基类的所有成员】

#include <iostream>                         
using namespace std;
class Base                                      
{
private:
  int y;
protected:
  int x;
public:
  void setX(int i)
  {
    x=i;
  }
  void show()
  {
    cout<<"x="<<x<<endl;
  }
};
class Drevid: private Base               //私有继承访问                 
{
public:
    void show1()
    {
      cout<<"我的名字:"<<endl;
    }
};
int main()
{
  Base b;
  b.setX(10);             
  b.show();                
  Drevid d;
//  d.setX(20);   //会报错,因为现在基类的公有成员被私有成员访问,所以...
//  d.show();     //会报错,因为现在基类的公有成员被私有成员访问,所以...                     
  return 0;
}


相关文章
|
5天前
|
Java C++
C++的学习之路:21、继承(2)
C++的学习之路:21、继承(2)
14 0
|
29天前
|
C++
8. C++继承
8. C++继承
22 0
|
1月前
|
设计模式 存储 uml
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
29 1
|
29天前
|
安全 Java 编译器
C++:继承
C++:继承
32 0
|
1月前
|
安全 Java 编译器
C++:继承与派生
C++:继承与派生
|
1天前
|
设计模式 编译器 数据安全/隐私保护
C++ 多级继承与多重继承:代码组织与灵活性的平衡
C++的多级和多重继承允许类从多个基类继承,促进代码重用和组织。优点包括代码效率和灵活性,但复杂性、菱形继承问题(导致命名冲突和歧义)以及对基类修改的脆弱性是潜在缺点。建议使用接口继承或组合来避免菱形继承。访问控制规则遵循公有、私有和受保护继承的原则。在使用这些继承形式时,需谨慎权衡优缺点。
12 1
|
1月前
|
安全 编译器 程序员
C++中的继承
C++中的继承
22 2
|
1月前
|
算法 编译器 程序员
【C++ 泛型编程 入门篇】全面掌握C++元模板中的模板继承:模板继承深入指南和教程
【C++ 泛型编程 入门篇】全面掌握C++元模板中的模板继承:模板继承深入指南和教程
37 0
|
1月前
|
Java 编译器 C#
【C++ 继承的多样性】C++ 多继承与虚拟继承:探究核心原理与应用实践
【C++ 继承的多样性】C++ 多继承与虚拟继承:探究核心原理与应用实践
37 1
|
1月前
|
算法 编译器 程序员
【C++入门到精通】C++入门 —— 继承(基类、派生类和多态性)
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。
81 0