1、继承语法
class A : public B;
A 类称为子类 或 派生类
B 类称为父类 或 基类
2、继承方式
3、继承中的对象模型
#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;
};
//利用开发人员命令提示工具查看对象模型
//跳转盘符
//跳转文件路径 :cd 具体路径
//查看命名
//cl /d1 reportSingleClassLayout类名 文件名 例:01继承中的对象模型.cpp
void test()
{
//父类中所有非静态成员属性都会被子类继承下去
//父类中私有成员属性 是被编译器给隐蔽了,因此访问不到,但是确实被继承下去了
cout << "Size of Son = " << sizeof(Son) << endl;
}
int main()
{
test();
return 0;
}
4、构造函数和析构函数的顺序
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;
class Base
{
public:
Base()
{
m_A = 100;
}
void show()
{
cout << "Base的成员函数" << endl;
}
void show(int a)
{
cout << "Base的int a成员函数" << endl;
}
int m_A;
};
class Son :public Base
{
public:
Son()
{
m_A = 200;
}
void show()
{
cout << "Son的成员函数" << endl;
}
int m_A;
};
//同名属性的访问方式
void test01()
{
Son son;
cout << son.m_A << endl;
cout << son.Base::m_A << endl;
}
//同名函数的访问方式
void test02()
{
Son son;
son.show();
son.Base::show();
//如果子类中出现和父类同名的成员函数,子类的同名成员函数会隐藏父类中所有的同名成员函数,
// 无论父类的成员函数是否有参或者其他重载函数情况
son.Base::show(100);
}
int main()
{
//test01();
test02();
return 0;
}
6、同名静态成员处理
#include<iostream>
using namespace std;
class Base
{
public:
//1、同名静态成员属性
static int m_A;
//2、同名静态成员函数
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;
//1、访问同名静态成员属性
void test04()
{
//1、通过对象访问
Son s;
cout << s.m_A << endl;
cout << s.Base::m_A << endl;
//2、通过类名访问
cout << Son::m_A << endl;
//第一个::代表通过类名方式访问 第二个::代表访问Base作用域下
cout << Son::Base::m_A << endl;
}
//2、访问同名静态成员函数
void test02()
{
//静态成员有两种访问方式
//1、通过对象访问
Son s;
s.func();
s.Base::func();
//2、通过类名访问
Son::func();
//第一个::代表通过类名方式访问 第二个::代表访问Base作用域下
Son::Base::func() ;
}
int main()
{
test02();
return 0;
}
7、多继承语法
不建议去使用!
#include<iostream>
using namespace std;
class Base1
{
public:
Base1()
{
m_A = 100;
}
int m_A;
};
class Base2
{
public:
Base2()
{
m_A = 200;
}
int m_A;
};
class Son :public Base1, public Base2
{
public:
Son()
{
m_C = 300;
m_D = 400;
}
int m_C;
int m_D;
};
void test()
{
Son s;
cout << "Sizeof Son = " << sizeof(Son) << endl;
//多继承下的m_A同名,所以要加作用域区分
cout << s.Base1::m_A << endl;
cout << s.Base2::m_A << endl;
}
int main()
{
test();
return 0;
}
8、菱形继承及解决方法
用虚继承
#include<iostream>
using namespace std;
class Animal
{
public:
int m_Age;
};
//利用虚继承解决菱形继承的问题
//继承之前加上 virtual 变成虚继承
//Animal为虚基类
class Sheep:virtual public Animal {};
class Tou :virtual public Animal {};
class SheepTou :public Sheep, public Tou{};
void test()
{
SheepTou cnm;
cnm.Sheep::m_Age = 18;
cnm.Tou::m_Age = 28;
//当菱形继承时,两个父类拥有相同的数据,需要加以作用域区分
cout << cnm.Sheep::m_Age << endl;
cout << cnm.Tou::m_Age << endl;
cout << cnm.m_Age << endl;
}
int main()
{
test();
return 0;
}