一、继承的概念
1.1概念
简单的说:爸爸把自己的东西给儿子,儿子就拥有了这件东西并可以使用 。
官方:继承是面向对象编程(OOP)的核心概念之一,它允许一个类(子类/派生类)基于另一个类(父类/基类)来构建,自动获得父类的属性和方法,同时可以扩展或修改原有功能。
上代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class person
{
public:
person(int id = 0, string name = "小明", int age = 18)
:_id(id),
_name(name),
_age(age)
{
cout << "person()" << endl;
}
void test()
{
cout << "test()" << endl;
}
~person()
{
_id = 0;
_name.~string();
_age = 0;
cout << "~person()" << endl;
}
protected:
void test2()
{
cout << "test2()--protected" << endl;
}
private:
int _id;
string _name;
int _age;
};//父类
class student : public person//子类
{
public:
student()
:
_id ( 10000)
{
}
void test()
{
_id = 10;
cout << "studenttest()" << _id<<endl;
}
private:
int _id;
};
代码图一
如图写的学生(student)类就是人(person)类的派生类(子类),person类就是student的父类(基类);学生类继承了人类的内部属性以达到也可以使用其内部的test()函数;
1.2继承方式
儿子从父亲手中得到继承的方法有三种分别是使用:public,protected,private继承
如图:
快速记忆:继承的方法全部都是按两者最小的算的,如public继承的protected仍是继承到子类的protected中,而private继承到子类后不可见不可直接由子类调用。
当然如果父类有在公有或保护模块有调用其自身私有对象的函数子类也是可以调用的(以public继承来说);
1.3继承的隐藏观念
当儿子有一个相同的东西时这时候老爹又给儿子了一个差不多的东西(同名对象或同名函数),儿子就会把老爹给的东西藏起来备用优先用自己的东西;如代码图一test()函数由儿子构建的对象直接调用test()会调用自己的,但是如果在东西前加上老爹的名字就会把老爹的东西拿出来;
官方:在 C++ 中,隐藏(Hiding) 指的是派生类(子类)中的成员(成员函数或成员变量)遮蔽了基类(父类)中的同名成员,使得基类的成员在派生类的作用域内不可见。隐藏与 重写(Overriding) 不同,它不涉及虚函数和动态多态,而是由 名字查找规则(Name Lookup) 决定的静态行为。
代码如下:
class student : public person//子类
{
public:
student()
:
_id ( 10000)
{
test();
person::test();
}
优先调用自己的test(),再加上person后调用基类的test();
运行结果:

1.4继承时的构造析构规则
在派生类中基类的成员通常被看作一个整体。
重要:永远都是构造时父类先构造再构造子类,析构先析构子类在析构父类。编译器会按照父类本身的析构和构造在子类中的析构函数和构造函数中自动调用。(先父后子,先子后父);

1.5模板继承的问题
在进行模板继承时由于父类没有实例化的原因,在子类中调用父类的成员时要引用父类一下。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
template<class T>
class person
{
public:
person(int id = 0, string name = "小明", int age = 18)
:_id(id),
_name(name),
_age(age)
{
cout << "person()" << endl;
}
void test()
{
cout << "父亲test()" << endl;
}
T add(const T& a, const T& b)
{
return a + b;
}
~person()
{
_id = 0;
_name.~string();
_age = 0;
cout << "~person()" << endl;
}
protected:
void test2()
{
cout << "test2()--protected" << endl;
}
private:
int _id;
string _name;
int _age;
};//父类
template<class T>
class student : public person<T>//子类
{
public:
student()
:
_id ( 10000)
{//先父类构造
cout << "student()" << endl;//后子类
}
void test()
{
cout << person<T>::add(50, 100) << endl;;//调用时即使没有同名函数也要用前缀;
}
~student()
{
cout << "~student()" << endl;//先子
}//后父
private:
int _id;
};
int main()
{
student<int> a;
a.test();
}
1.6继承的友元
只说一点:爸爸的朋友不是你的朋友,他的朋友可以用她的东西,但不可以随意用你的东西;
4365

被折叠的 条评论
为什么被折叠?



