1、基本语法
#include <iostream> using namespace std; #include <string>//普通实现页面//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; // } //};//继承实现页面//公共页面 class BasePage { public:void header() {cout << "首页、公开课、登录、注册...(公共头部)" << endl;}void footer() {cout << "帮助中心、交流合作、站内地图...(公共底部)" << endl;}void left() {cout << "Java、python、c++...(公共分类列表)" << endl;} };//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() {cout << "Java下载视频页面如下:" << endl;Java ja;ja.header();ja.footer();ja.left();ja.content();cout << "---------------------------" << endl;cout << "Python下载视频页面如下:" << endl;Python py;py.header();py.footer();py.left();py.content();cout << "---------------------------" << endl;cout << "C++下载视频页面如下:" << endl;CPP cpp;cpp.header();cpp.footer();cpp.left();cpp.content(); }int main() {test01();system("pause");return 0; }
2、继承方式
继承方式一共有三种:
- 公共继承
- 保护继承
- 私有继承
#include <iostream> using namespace std; #include <string>//公共继承 class Base1 { public:int m_A; protected:int m_B; private:int m_C; };class Son1 :public Base1 {void func() {m_A = 10;//父类中的公共权限成员 到子类中依然是公共权限m_B = 10;//父类中的保护权限成员 到子类中依然是保护权限//m_C = 10;//父类中的私有权限成员 子类访问不到} }; void test01() {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() {m_A = 10;//父类中的公共权限成员 到子类中是保护权限m_B = 10;//父类中的保护权限成员 到子类中依然是保护权限//m_C = 10;//父类中的私有权限成员 子类访问不到} };void test02() {Son2 s1;//s1.m_A = 1000;//在son2中 m_A变为保护权限 因此类外访问不到//s1.m_B = 1000;//在son2中 m_B保护权限 不可以访问 }//私有继承 class Base3 { public:int m_A; protected:int m_B; private:int m_C; }; class Son3 :private Base2 { public:void func() {m_A = 10;//父类中的公共权限成员 到子类中是私有权限m_B = 10;//父类中的保护权限成员 到子类中是私有权限//m_C = 10;//父类中的私有权限成员 子类访问不到} };class GrandSon3 :public Son3 { public:void func() {//m_A = 1000;//到了son3中 m_A变为私有 即使是儿子 也访问不到//m_B = 1000;//到了son3中 m_B变为私有 即使是儿子 也访问不到} };void test03() {Son3 s1;//s1.m_A = 1000;//在son3中 m_A变为私有权限 因此类外访问不到//s1.m_B = 1000;//在son3中 m_B私有权限 不可以访问 }int main() {system("pause");return 0; }
3、继承中的对象模型
#include <iostream> using namespace std; #include <string>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 << "size of Son = " << sizeof(Son) << endl; }int main() {system("pause");return 0; }
4、继承中构造和析构顺序
#include <iostream> using namespace std; #include <string>//继承中的构造和析构顺序 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; }
5、同名成员处理
#include <iostream> using namespace std; #include <string>class Base { public:Base() {m_A = 100;}void func() {cout << "Base - func()调用" << endl;}void func(int a) {cout << "Base - func(int a)调用" << endl;}int m_A; }; class Son :public Base { public:Son() {m_A = 200;}void func() {cout << "Son - func()调用" << endl;}int m_A; };//同名成员属性 void test01() {Son s;cout << "Son 下m_A = " << s.m_A << endl;//如果通过子类对象 访问到父类中同名成员 需要加作用域cout << "Base 下m_A = " << s.Base::m_A << endl;}//同名成员函数处理 void test02() {Son s;s.func();//直接调用 调用是子类中的同名成员s.Base::func();//调用父类的//如果子类中出现和父类同名的成员函数,子类的同名成员会隐藏掉父类中所有同名的成员函数//如果想访问到父类中被隐藏的同名成员函数,需要加作用域//s.func(100); 错误s.Base::func(100); }int main() {//test01();test02();system("pause");return 0; }
6、同名静态成员处理方法
#include <iostream> using namespace std; #include <string>class Base { public:static int m_A;static void func() {cout << "Base - static void func()" << endl;} }; int Base::m_A=100;class Son :public Base { public:static int m_A;static void func() {cout << "Son - static void func()" << endl;} }; 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(); }int main() {//test01();test02();system("pause");return 0; }
7、多继承语法
#include <iostream> using namespace std; #include <string>class Base1 { public:Base1() {m_A = 100;}int m_A; };class Base2{ public:Base2() {m_A = 200;}int m_A; };//子类 需要继承Base1 和Base2 class Son :public Base1, public Base2 { public:Son() {m_C = 300;m_D = 400;}int m_C;int m_D; };void test01() {Son s;cout << "sizeof Son = " << sizeof(s) << endl;//当父类中出现同名成员,需要加作用域区分cout << "Base1::m_A = " << s.Base1::m_A << endl;cout << "Base2::m_A = " << s.Base2::m_A << endl; }int main() {test01();system("pause");return 0; }
8、菱形继承
菱形继承概念:
两个派生类继承同一个基类又有某个类同时继承者两个派生类
这种继承被称为菱形继承,或者钻石继承
#include <iostream> using namespace std; #include <string>//动物类 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 = 18;st.Tuo::m_Age = 28;//当菱形继承,两个父类拥有相同数据,需要加以作用域区分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; }