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;
}

如有不解,随时支持私聊!!!!!

相关文章
|
1月前
|
安全 程序员 编译器
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
80 11
|
1月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
53 1
|
1月前
|
C++
C++番外篇——虚拟继承解决数据冗余和二义性的原理
C++番外篇——虚拟继承解决数据冗余和二义性的原理
39 1
|
1月前
|
安全 编译器 程序员
C++的忠实粉丝-继承的热情(1)
C++的忠实粉丝-继承的热情(1)
18 0
|
1月前
|
编译器 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
29 0
|
1月前
|
程序员 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
32 0
|
2月前
|
C++
C++(二十)继承
本文介绍了C++中的继承特性,包括公有、保护和私有继承,并解释了虚继承的作用。通过示例展示了派生类如何从基类继承属性和方法,并保持自身的独特性。此外,还详细说明了派生类构造函数的语法格式及构造顺序,提供了具体的代码示例帮助理解。
|
2月前
|
C++
c++继承层次结构实践
这篇文章通过多个示例代码,讲解了C++中继承层次结构的实践应用,包括多态、抽象类引用、基类调用派生类函数,以及基类指针引用派生类对象的情况,并提供了相关的参考链接。
|
3月前
|
编译器 C++
C++的基类和派生类构造函数
基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承。构造函数不能被继承是有道理的,因为即使继承了,它的名字和派生类的名字也不一样,不能成为派生类的构造函数,当然更不能成为普通的成员函数。 在设计派生类时,对继承过来的成员变量的初始化工作也要由派生类的构造函数完成,但是大部分基类都有 private 属性的成员变量,它们在派生类中无法访问,更不能使用派生类的构造函数来初始化。 这种矛盾在C++继承中是普遍存在的,解决这个问题的思路是:在派生类的构造函数中调用基类的构造函数。 下面的例子展示了如何在派生类的构造函数中调用基类的构造函数:
|
3月前
|
安全 Java 编译器