欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++基础知识-派生类、调用顺序、访问等级、函数遮蔽

程序员文章站 2022-10-06 18:46:37
一、派生类的概念 类之间有一种层次关系,有父亲类,有孩子类。 车这个类,当成父类(也叫基类、超类),派生出卡车、轿车,他们属于孩子类(子类、派生类) 继承:有父亲类,有孩子类,构成了层次关系。继承这种概念,是咱们面向对象程序设计的核心思想之一。 我们通过继承父类来构建新的类:子类;所以,我们只需要写 ......

 一、派生类的概念

类之间有一种层次关系,有父亲类,有孩子类。

车这个类,当成父类(也叫基类、超类),派生出卡车、轿车,他们属于孩子类(子类、派生类)

继承:有父亲类,有孩子类,构成了层次关系。继承这种概念,是咱们面向对象程序设计的核心思想之一。

我们通过继承父类来构建新的类:子类;所以,我们只需要写和子类相关的一些内容即可。

子类一般会比父类更加庞大。

二、派生类对象定义时调用构造函数的顺序

当定义子类对象时,是要调用父类和子类的构造函数的,而且父类的构造函数的函数体先执行,子类的构造函数的函数体后执行。

 三、public、protected、private

三种访问权限   三种继承访问
public:可以被任意实体所访问   public继承
protected:只允许本类或者子类的成员函数来访问   protected继承
private:只允许本类的成员函数来访问   private继承
     
基类中的访问权限 子类继承基类的继承方式 子类得到的访问权限
public public public
protected public protected
private public 子类无访问权限
     
public protected protected
protected protected protected
private protected 子类无访问权限
     
public private private
protected private private
private private 子类无访问权限

总结:

  (1)子类public继承父类不改变父类的访问权限;

  (2)protected继承父类中public成员变为子类protected成员;

  (3)private继承使得父类中所有成员在子类中的访问权限变为private;

  (4)对父类中的private成员不受继承方式的影响,子类永远无访问权限;

  (5)对父类来讲,尤其是父类的成员函数,如果你不想让外界访问,就设置为private,如果你想让自己的子类能够访问,就设置为protected,如果你想公开,就设置为public。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

四、函数遮蔽

子类中如果有一个同名函数,那么父类中,不管有几个同名函数,子类中都无法访问到。

如果我们确实下你给用父类中的同名函数,该怎么办?

(1)在子类的成员函数中,用“父类::函数名”轻质调用父类函数。

(2)using : using namespace 

c++11中,让父类同名函数在子类中可见;

通过using这个关键字,让父类的同名函数在子类中可见,即“让父类同名函数在子类中以重载的方式来使用”。

说明:

(a)using human::samenamefunc:只能指定函数名,则凡是基类中的public的samenamefunc,在子类中都可见。你无法让一部分父类中的同名函数不可见;

(b)using引入的主要目的是用来实现在子类对象中调用父类的重载版本。该函数在父类中的参数跟子类中的参数、类型、个数不同。 

本节案例:

// main.cpp
#include <iostream>
#include "human.h"
#include "men.h"

using namespace std;

int main()
{
  men men; // 当定义子类对象时,是要调用父类和子类的构造函数,父类的构造函数的函数体先执行,子类的构造函数的函数体后执行
  men.samenfunc(12,12,12,12); // 调用子类本身的方法
  men.samefunc(); // 因为在子类中声明了与父类同名的函数,所以不能使用父类的同名函数,但是根据using human::samenamefunc使得子类可以使用父类的同名函数
  men.samefunc(12);
  men.samefunc(12,12);
  men.samefunc(12,12,12);
  
  return 0;
}

// human.h
#ifndef __human__
#define __human__
#include <iostream>
class human
{
public:
  human();
  human(int);

public:
  void samenamefunc();
  void samenamefunc(int);
  void samenamefunc(int,int);
  void samenamefunc(int,int,int);

public:
  int m_age;  // 年龄
  char m_name[100]; // 名字
};
#endif
// human.cpp #include "human.h" #include <iostream> human::human() { std::cout << "调用human::human()" <<std::endl; } human::human(int) { std::cout << "调用human::human(int)" <<std::endl; } void human::samenamefunc() { human::samenamefunc(); // 调用父类的方法 std::cout << "调用human::samenamefunc()" <<std::endl; } void human::samenamefunc(int) { std::cout << "调用human::samenamefunc(int)" <<std::endl; } void human::samenamefunc(int,int) { std::cout << "调用human::samenamefunc(int,int)" <<std::endl; } void human::samenamefunc(int,int,int) { std::cout << "调用human::samenamefunc(int,int,int)" <<std::endl; } // men.h #ifndef __men__ #define __men__ class men : public human // 表示men是human的子类 { public: men(); public: void samenamefunc(int,int,int,int); public: using human::samenamefunc; // 让父类的同名函数在子类中可见,即子类可以使用父类的同名函数 }; #endif

// men.cpp #include "men.h" #include <iostream> men::men() { std::cout << "调用了men::men()" << std::endl; } void men::samenamefunc(int,int,int,int) { std::cout << "调用了men::samenamefunc(int,int,int,int)" << std::endl; }