El concepto de herencia en C++.

Tabla de contenido

1. Introducción a la herencia

2. Método de herencia

          2.1 Composición de clases derivadas

         2.2 Método de herencia de clases derivadas

3. Modelo de objetos en herencia.

4. El orden de construcción y destrucción en la herencia

5. Heredar el método de procesamiento del mismo nombre.

        5.1 Miembros ordinarios

        5.2 miembros estáticos

6. Herencia múltiple


1. Introducción a la herencia

Lo que existía originalmente era la clase base, también llamada clase padre. Un nuevo tipo de datos definido utilizando un tipo de datos existente se denomina clase derivada, también denominada subclase.

La clase base define los miembros que son comunes a todas las subclases de la clase y la clase derivada define los miembros que son únicos para cada clase.
Hay tres métodos de herencia diferentes para clases derivadas en C++: público, protegido y privado. (El valor predeterminado es privado)
 

herencia única

El formato de herencia única consiste en derivar subclases de la misma clase base.

class Father{};
class Son1:public Father{}; // public 方式继承
class Son2 :protected Father{}; // protected 方式继承
class Son3 :private Father{}; // private 方式继承
herencia múltiple

La herencia múltiple es una clase derivada que se deriva de múltiples clases base.

class Base1{};
class Base2{};
class SubMulBase :public Base1, public Base2{};

2. Método de herencia

 2.1 Composición de clases derivadas

Una clase derivada consta de dos partes, una son los atributos heredados de la clase principal y la otra son los atributos agregados a la clase actual.

class Base
{
public:
	int m_A;

};

class SubBase :public Base
{
public :
	int m_B;
private:
	int m_C;
};

 2.2 Método de herencia de clases derivadas

gramática:

class 子类: 继承方式 父类

Hay tres métodos de herencia:

  • herencia publica
  • herencia protegida
  • Herencia privada:
    el alcance de cada atributo heredado en la clase derivada derivada (lo mismo ocurre con los métodos).
class Father
{
public:
	int m_A;
protected:
	int m_B;
private:
	int m_C;
};

class Son:protectedFather
{
};

Entonces, los atributos en la subclase en este momento son en realidad: (no se puede acceder a los privados). 

class Son:protectedFather
{
protected:
	int m_A;
	int m_B;
};


3. Modelo de objetos en herencia.  

 

class Base
{
public:
	int m_A;
protected:
	int m_B;
private:
	int m_C; //私有成员只是被隐藏了,但是还是会继承下去
};

//公共继承
class Son :public Base
{
public:
	int m_D;
};

void test01()
{
	cout << "sizeof Son = " << sizeof(Son) << endl;
}

Resultado de salida: 

 

 

 

4. El orden de construcción y destrucción en la herencia

class Base 
{
public:
	Base()
	{
		cout << "Base构造函数!" << endl;
	}
	~Base()
	{
		cout << "Base析构函数!" << endl;
	}
};

class Son : public Base
{
public:
	Son()
	{
		cout << "Son构造函数!" << endl;
	}
	~Son()
	{
		cout << "Son析构函数!" << endl;
	}

};

 

 

5. Heredar el método de procesamiento del mismo nombre.

 5.1 Miembros ordinarios

  • Para acceder a miembros de la subclase con el mismo nombre, puede acceder a ellos directamente
  • Acceder a miembros de la clase principal con el mismo nombre requiere agregar un alcance
class Base {
public:
	Base()
	{
		m_A = 100;
	}

	void func()
	{
		cout << "Base - func()调用" << endl;
	}

	void func(int a)
	{
		cout << "Base - func(int a)调用" << endl;
	}

public:
	int m_A;
};


class Son : public Base {
public:
	Son()
	{
		m_A = 200;
	}

	//当子类与父类拥有同名的成员函数,子类会隐藏父类中所有版本的同名成员函数
	//如果想访问父类中被隐藏的同名成员函数,需要加父类的作用域
	void func()
	{
		cout << "Son - func()调用" << endl;
	}
public:
	int m_A;
};

void test01()
{
	Son s;

	cout << "Son下的m_A = " << s.m_A << endl;
	cout << "Base下的m_A = " << s.Base::m_A << endl;

	s.func();
	s.Base::func();
	s.Base::func(10);

}
int main() {

	test01();

	system("pause");
	return EXIT_SUCCESS;
}

 

Resumir:

  1. Los objetos de subclase pueden acceder directamente a miembros con el mismo nombre en la subclase
  2. Los objetos de subclase más el alcance pueden acceder a miembros de la clase principal con el mismo nombre
  3. Cuando una subclase y una clase principal tienen una función miembro con el mismo nombre, la subclase ocultará la función miembro con el mismo nombre en la clase principal. Agregar un alcance puede acceder a la función con el mismo nombre en la clase principal.

 

5.2 miembros estáticos

  • Para acceder a miembros de la subclase con el mismo nombre, puede acceder a ellos directamente
  • Acceder a miembros de la clase principal con el mismo nombre requiere agregar un alcance
class Base {
public:
	static void func()
	{
		cout << "Base - static void func()" << endl;
	}
	static void func(int a)
	{
		cout << "Base - static void func(int a)" << endl;
	}

	static int m_A;
};

int Base::m_A = 100;

class Son : public Base {
public:
	static void func()
	{
		cout << "Son - static void func()" << endl;
	}
	static int m_A;
};

int Son::m_A = 200;

//同名成员属性
void test01()
{
	//通过对象访问
	cout << "通过对象访问: " << endl;
	Son s;
	cout << "Son  下 m_A = " << s.m_A << endl;
	cout << "Base 下 m_A = " << s.Base::m_A << endl;

	//通过类名访问
	cout << "通过类名访问: " << endl;
	cout << "Son  下 m_A = " << Son::m_A << endl;
	cout << "Base 下 m_A = " << Son::Base::m_A << endl;
}

//同名成员函数
void test02()
{
	//通过对象访问
	cout << "通过对象访问: " << endl;
	Son s;
	s.func();
	s.Base::func();

	cout << "通过类名访问: " << endl;
	Son::func();
	Son::Base::func();
	//出现同名,子类会隐藏掉父类中所有同名成员函数,需要加作作用域访问
	Son::Base::func(100);
}
int main() {

	//test01();
	test02();

	system("pause");

	return 0;
}

6. Herencia múltiple

Sintaxis: clase subclase: método de herencia clase principal 1, método de herencia clase principal 2...

La herencia múltiple puede hacer que aparezcan miembros con el mismo nombre en la clase principal y se requiere diferenciación de alcance.
En la herencia múltiple, si aparecen miembros con el mismo nombre en la clase principal, se deben agregar ámbitos al usar la subclase.
 

 

 

Supongo que te gusta

Origin blog.csdn.net/weixin_63246738/article/details/131890682
Recomendado
Clasificación