

#include<iostream>
 using namespace std;
//普通实现页面
 //Java页面
 //class Java
 //{
 //public:
 //    void header()
 //    {
 //        cout << "首页、公开课、登录、注册...(公共头部)" << endl;
 //    }
 //    void footer()
 //    {
 //        cout << "帮助中心、交流合作、站内地图...(公共底部)" << endl;
 //    }
 //    void left()
 //    {
 //        cout << "Java,Python,C++...(公共分类列表)" << endl;
 //    }
 //    void content()
 //    {
 //        cout << "JAVA学科视频" << endl;
 //    }
 //};
 Python页面
 //class Python
 //{
 //public:
 //    void header()
 //    {
 //        cout << "首页、公开课、登录、注册...(公共头部)" << endl;
 //    }
 //    void footer()
 //    {
 //        cout << "帮助中心、交流合作、站内地图...(公共底部)" << endl;
 //    }
 //    void left()
 //    {
 //        cout << "Java,Python,C++...(公共分类列表)" << endl;
 //    }
 //    void content()
 //    {
 //        cout << "Python学科视频" << endl;
 //    }
 //};
 C++页面
 //class CPP
 //{
 //public:
 //    void header()
 //    {
 //        cout << "首页、公开课、登录、注册...(公共头部)" << endl;
 //    }
 //    void footer()
 //    {
 //        cout << "帮助中心、交流合作、站内地图...(公共底部)" << endl;
 //    }
 //    void left()
 //    {
 //        cout << "Java,Python,C++...(公共分类列表)" << endl;
 //    }
 //    void content()
 //    {
 //        cout << "C++学科视频" << endl;
 //    }
 //};
 //
 //void test01()
 //{
 //    //Java页面
 //    cout << "Java下载视频页面如下: " << endl;
 //    Java ja;
 //    ja.header();
 //    ja.footer();
 //    ja.left();
 //    ja.content();
 //    cout << "--------------------" << endl;
 //
 //    //Python页面
 //    cout << "Python下载视频页面如下: " << endl;
 //    Python py;
 //    py.header();
 //    py.footer();
 //    py.left();
 //    py.content();
 //    cout << "--------------------" << endl;
 //
 //    //C++页面
 //    cout << "C++下载视频页面如下: " << endl;
 //    CPP cp;
 //    cp.header();
 //    cp.footer();
 //    cp.left();
 //    cp.content();
 //
 //}
 //
 //int main()
 //{
 //    test01();
 //
 //    system("pause");
 //    return 0;
 //}
//继承实现页面
 //公共页面
 class BasePage
 {
 public:
     void header()
     {
         cout << "首页、公开课、登录、注册...(公共头部)" << endl;
     }
    void footer()
     {
         cout << "帮助中心、交流合作、站内地图...(公共底部)" << endl;
     }
     void left()
     {
         cout << "Java,Python,C++...(公共分类列表)" << endl;
     }
};
 //继承的好处:减少重复代码
 //语法:  class 子类:继承方式 父类
 //子类  也称为  派生类
 //父类  也称为   基类
//Java页面
 class Java : public BasePage
 {
 public:
     void content()
     {
         cout << "JAVA学科视频" << endl;
     }
 };
 //Python页面
 class Python : public BasePage
 {
 public:
     void content()
     {
         cout << "Python学科视频" << endl;
     }
 };
 //C++页面
 class CPP : public BasePage
 {
 public:
     void content()
     {
         cout << "C++学科视频" << endl;
     }
 };
void test01()
 {
     //Java页面
     cout << "Java下载视频页面如下: " << endl;
     Java ja;
     ja.header();
     ja.footer();
     ja.left();
     ja.content();
     cout << "--------------------" << endl;
    //Python页面
     cout << "Python下载视频页面如下: " << endl;
     Python py;
     py.header();
     py.footer();
     py.left();
     py.content();
     cout << "--------------------" << endl;
    //C++页面
     cout << "C++下载视频页面如下: " << endl;
     CPP cp;
     cp.header();
     cp.footer();
     cp.left();
     cp.content();
 }
int main() {
test01();
system("pause");
    return 0;
 }



#include<iostream>
 using namespace std;
//继承方式
 //公共继承
 class Base1
 {
 public:
     int m_A;
 protected:
     int m_B;
 private:
     int m_C;
 };
class Son1 :public Base1
 {
 public:
     void func()
     {
         //可访问 public权限
         m_A;//父类中的公共权限成员 到子类中依然是公共权限
         //可访问 protected权限
         m_B; //父类中的保护权限成员 到子类中依然是保护权限
         //不可访问
         //m_C; //父类中的私有权限成员  子类访问不到
     }
 };
void myClass()
 {
     Son1 s1;
     s1.m_A = 100; //其他类只能访问到公共权限
     //s1.m_B = 100;//到Son1中 m_B是保护权限 类外访问不到
 }
//保护继承
 class Base2
 {
 public:
     int m_A;
 protected:
     int m_B;
 private:
     int m_C;
 };
 class Son2:protected Base2
 {
 public:
     void func()
     {
         //可访问 protected权限
         m_A;   //父类中公共成员,到子类中变为保护权限
         //可访问 protected权限
         m_B;   //父类中保护成员,到子类中变为保护权限
         //不可访问
         //m_C; //父类中私有成员  子类访问不到
     }
 };
 void myClass2()
 {
     Son2 s;
     //不可访问
     //s.m_A = 100; //在Son2中 m_A变为保护权限,因此类外访问不到
     //s.m_B = 100; //在Son2中 m_B变保护权限,不可以访问
 }
//私有继承
 class Base3
 {
 public:
     int m_A;
 protected:
     int m_B;
 private:
     int m_C;
 };
 class Son3:private Base3
 {
 public:
     void func()
     {
         //可访问 private权限
         m_A; //父类中公共成员,到子类中变为私有成员
         //可访问 private权限
         m_B; //父类中保护成员,到子类中变为私有成员
         //不可访问
         //m_C; //父类中私有成员  子类访问不到
     }
 };
class GrandSon3 :public Son3
 {
 public:
     void func()
     {
         //Son3是私有继承,所以继承Son3的属性在GrandSon3中都无法访问到
         //m_A = 1000;//到了Son3中 m_A变为私有,即使是儿子,也是访问不到
         //m_B = 1000;//到了Son3中 m_B变为私有,即使是儿子,也是访问不到
    }
 };
void myClass3()
 {
     Son3 s;
     //不可访问
     //s.m_A = 1000; //在Son3中 变为私有成员  类外访问不到
     //s.m_B = 1000; //在Son3中 变为私有成员  类外访问不到
 }

#include<iostream>
 using namespace std;
//继承中的对象模型
 class Base
 {
 public:
     int m_A;
 protected:
     int m_B;
 private:
     int m_C; //私有成员只是被隐藏了,但是还是会继承下去
 };
//公共继承
 class Son :public Base
 {
 public:
     int m_D;
 };
//利用开发人员命令提示工具查看对象模型
 //跳转盘符 F:
 //跳转文件路径 cd 具体路径下
 //查看命名
 //cl /d1 reportSingleClassLayout类名 文件名
void test01()
 {
     //16
     //父类中所有非静态成员属性都会被子类继承下去
     //父类中私有成员属性 是被编译器给隐藏了,因此是访问不到,但是确实被继承下去了
     cout << "sizeof Son = " << sizeof(Son) << endl;
 }
int main() {
test01();
system("pause");
    return 0;
 }
结论:父类中私有成员也是被子类继承下去了,只是由编译器给隐藏后访问不到

#include<iostream>
 using namespace std;
//继承中的构造和析构顺序
 class Base
 {
 public:
     Base()
     {
         cout << "Base构造函数!" << endl;
     }
     ~Base()
     {
         cout << "Base析构函数!" << endl;
     }
 };
class Son : public Base
 {
 public:
     Son()
     {
         cout << "Son构造函数!" << endl;
     }
     ~Son()
     {
         cout << "Son析构函数!" << endl;
     }
};
 void test01()
 {
     //继承中 先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反
     Son s;
 }
int main() {
test01();
system("pause");
    return 0;
 }
总结:继承中 先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反

#include<iostream>
 using namespace std;
//继承中同名成员处理
 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;
 }
总结:
1. 子类对象可以直接访问到子类中同名成员
 2. 子类对象加作用域可以访问到父类同名成员
 3. 当子类与父类拥有同名的成员函数,子类会隐藏父类中同名成员函数,加作用域可以访问到父类中同名函数

#include<iostream>
 using namespace std;
//继承中的同名静态成员处理方式
 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()
 {
     //1.通过对象访问
     cout << "通过对象访问: " << endl;
     Son s;
     cout << "Son  下 m_A = " << s.m_A << endl;
     cout << "Base 下 m_A = " << s.Base::m_A << endl;
    //2.通过类名访问
     cout << "通过类名访问: " << endl;
     cout << "Son  下 m_A = " << Son::m_A << endl;
     //第一个::代表通过类名方式访问 第二个::代表访问父类作用域下
     cout << "Base 下 m_A = " << Son::Base::m_A << endl;
 }
//同名静态成员函数
 void test02()
 {
     //1.通过对象访问
     cout << "通过对象访问: " << endl;
     Son s;
     s.func();
     s.Base::func();
     //2.通过类名访问
     cout << "通过类名访问: " << endl;
     Son::func();
     Son::Base::func();
     //出现同名,子类会隐藏掉父类中所有同名成员函数,需要加作作用域访问
     Son::Base::func(100);
 }
 int main() {
    //test01();
     test02();
system("pause");
    return 0;
 }
总结:同名静态成员处理方式和非静态处理方式一样,只不过有两种访问的方式(通过对象 和 通过类名)

#include<iostream>
 using namespace std;
//多继承语法
class Base1
 {
 public:
     Base1()
     {
         m_A = 100;
     }
 public:
     int m_A;
 };
class Base2 {
 public:
     Base2()
     {
         m_A = 200;  //开始是m_B 不会出问题,但是改为m_A就会出现不明确
     }
 public:
     int m_A;
 };
//语法:class 子类:继承方式 父类1 ,继承方式 父类2
 class Son : public Base2, public Base1
 {
 public:
     Son()
     {
         m_C = 300;
         m_D = 400;
     }
 public:
     int m_C;
     int m_D;
 };
 //多继承容易产生成员同名的情况
 //通过使用类名作用域可以区分调用哪一个基类的成员
 void test01()
 {
     Son s;
     cout << "sizeof Son = " << sizeof(s) << endl;
     //当父类中出现同名成员,需要加作用域区分
     cout << s.Base1::m_A << endl;
     cout << s.Base2::m_A << endl;
 }
int main()
 {
test01();
system("pause");
    return 0;
 }
总结: 多继承中如果父类中出现了同名情况,子类使用时候要加作用域



#include<iostream>
 using namespace std;
//动物类
 class Animal
 {
 public:
     int m_Age;
 };
 //利用虚继承 解决菱形继承的问题
 //继承前加virtual关键字后,变为虚继承
 //此时公共的父类Animal称为虚基类
 //羊类
 class Sheep : virtual public Animal {};
 //驼类
 class Tuo   : virtual public Animal {};
 //羊驼类
 class SheepTuo : public Sheep, public Tuo {};
void test01()
 {
     SheepTuo st;
     st.Sheep::m_Age = 100;
     st.Tuo::m_Age = 300;
     //当菱形继承,两个父类拥有相同数据,需要加以作用域区分
     cout << "st.Sheep::m_Age = " << st.Sheep::m_Age << endl;
     cout << "st.Tuo::m_Age = " <<  st.Tuo::m_Age << endl;
     cout << "st.m_Age = " << st.m_Age << endl;
     //这份数据我们知道  只有一份就可以,菱形继承导致数据有两份,资源浪费
     
 }
 int main() {
test01();
system("pause");
    return 0;
 }
总结:
* 菱形继承带来的主要问题是子类继承两份相同的数据,导致资源浪费以及毫无意义
 * 利用虚继承可以解决菱形继承问题