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

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

4.【私有继承下访问基类的私有数据成员】

#include <iostream>                         
using namespace std;
class Base
{
private:
  int y;
protected:
  int x;
public:
  void setY()
  {
    cout << "结果为:y=" << 10 << endl;
  }
  void setX(int i)
  {
    x = i;
  }
  void show()
  {
    cout << "x=" << x << endl;
  }
  int getX()
  {
    return x;
  }
};
class Drevid : private Base
{
public:
  void show1()
  {
    setY();                      //会变成私有
  }
};
int main()
{
  Base b;
  b.setX(10);
  b.show();
  Drevid d;
  d.show1();    //派生类可以访问派生类
  return 0;
}

5.【私有继承下进一步派生】

#include <iostream>                         
using namespace std;
class Base                                      
{
private:
  int y;
protected:
  int x;
  void setY()
  {
    y=10;
   }
public:
  void setX(int i)
  {
    x=i;
  }
  void show()
  {
    cout<<"x="<<x<<endl;
  }
  int getX()
  {
    return x;
  }
};
class Drevid: private Base                     
{
public:
  void show1()
  {
    setY();                      //基类中的保护会员变成私有成员
  } 
};
class DDrevid: public Drevid          //用公有继承的方式进一步派生后
{
public:
  void f()
  {
  //  setY();        报错             //进一步派生后,仍然还是私有成员
  }
};
int main()
{
  Base b;
  b.setX(10);
  b.show();
  Drevid d;
//  d.setY();        报错     //这个已经变成派生类的私有成员,在类外不能访问.
  d.show1();   
  DDrevid d1;
  d1.f();           //进一步派生后,仍然无法访问
  return 0;
}

6.【保护继承进一步派生】

#include <iostream>                         
using namespace std;
class Base
{
private:
  int y;
protected:
  int x;
  void setY()
  {
    y = 10;
  }
public:
  void setX(int i)
  {
    x = i;
  }
  void show()
  {
    cout << "x=" << x << endl;
  }
  int getX()
  {
    return x;
  }
};
class Drevid : protected Base
{
public:
  void show1()
  {
    setY();                      //基类中的保护成员会变成保护成员
  }
};
class DDrevid : public Drevid
{
public:
  void f()
  {
    setY();                     //进一步派生后,公有继承下仍然是保护成员
  }
};
int main()
{
  Base b;
  b.setX(10);
  b.show();
  Drevid d;
  //  d.setY();         报错    //这个已经变成派生类的保护成员,在类外不能访问.
  d.show1();
  DDrevid d1;
  d1.f();              //可以访问
  return 0;
}

(七)、派生类的构造函数

1.什么是派生类的构造函数:

1.派生类的数据成员既包括从基类继承的数据成员,也包括派生类新增的数据成员,甚至还可能包括派生类内定义的内嵌成员对象.

2.派生类构造函数在对派生类对象进行初始化时需要对基类数据成员,新增数据成员和内嵌对象成员进行初始化.

3.派生类会继承除基类构造函数外的所有基类成员,也就是说,(派生类是不能继承基类的构造函数的!!!)

4.在定义派生类的构造函数时除了对自己的数据成员进行初始化外,还必须借助派生类的构造函数,调用基类的构造函数,从而结组基类的构造函数,从而借助基类的构造函数,来初始化从基类继承的数据成员.

5.如果派生类拥有对象成员时,派生类的构造函数还拥有对象成员所属类构造函数,来初始化这个对象成员.

2.派生类构造函数的格式(构造函数先基再派,析构函数先派后基)

(2).派生类的构造函数的定义格式:

派生类名::派生类名(): 类名(),内嵌对象成员名1…

{

派生类新增成员的初始化

}

(3).当基类中没有显示定义构造函数时,派生类的构造函数定义可以省略,系统采用默认的构造函数

(4).当基类定义了具有形参的构造函数时,派生类很可能也需要显示定义构造函数,提供将参数传递给基类构造函数的途径,使基类对象在初始化时可以获取相关数据,在某些情况下,派生类构造函数的函数体可能为空,仅起参数产地及调用基类与内嵌对象构造函数的作用

(5).派生类定义构造函数会自动调用基类构造函数

3.实列(派生类构造函数的初始化)

代码展示:

#include <iostream>
using namespace std;
class Inner
{
private:
  int y;
public:
  Inner(int b)
  {
    y=b;
    cout<<"inner的构造函数:"<<y<<endl;
  }
};
class Base
{
protected:
  int x;
public:
  Base(int a)
  {
    x=a;
    cout<<"基类的构造函数:"<<x<<endl;
  }
};
class Derived: public Base
{
private:
  Inner i;
  int z;
public:
  Derived(int a,int b,int c):Base(a),i(b)                 //派生类构造函数,有内嵌,加派生类新增
  {
    z=c;
    cout<<"派生类的构造函数:"<<z<<endl;
  }
};
int main()
{
  Base b(100);
  cout<<"*************************************"<<endl;
  Derived d(10,20,30);                                                       //+++++++++++++++
  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