C++继承
继承的语法
单继承语法格式:
class 子类 : 继承方式 父类
多继承语法格式:
class 子类 : 继承方式 父类1 ,继承方式 父类2……
继承方式:
- public:
- protected:
- private:
如上图所示:
- 使用公有继承的时候,子类里面除了父类的private作用域都按父类的作用域继承
- 使用保护继承的时候,子类里面除了父类的private作用域都要按protected方式继承
- 使用私有继承的时候,子类里面都是私有作用域
同名成员处理
1.子类对象可以直接访问到子类同名成员
2.子类对象访问父类同名成员需要加作用域
3.当子类和父类出现同名成员时会隐藏父类的同名成员 ,加作用域可以访问到父类的同名成员
同名静态成员的处理与上述
#include<iostream>
using namespace std;
// 创建基类
class base
{
public:
static int m_num;//静态成员变量需要 类内声明 类外定义
};
int base::m_num = 100;
//创建子类
class son:public base
{
public:
static int m_num;
};
int son::m_num = 200;
void test01()
{
son s;
//访问静态成员可以有两种方法 :
//1、通过对象访问
//2、通过类名访问
//通过对象访问
cout << "son - m_num ==" << s.m_num << endl;
cout << "base - m_num ==" << s.base::m_num << endl;
//通过类名访问
cout << "son - m_num ==" << son::m_num << endl;
cout << "base - m_num ==" << son::base::m_num << endl; //通过类名son 访问父类base作用域下的成员变量
//当子类与父类的成员函数名相同时,编译器会隐藏父类的成员函数 如果要访问需要 加上作用域
}
int main(void)
{
test01();
}
虚继承和菱形继承
通过虚继承可以解决菱形继承的问题
此时使用虚继承则Animal 就成为虚基类
使用虚继承后会有一个虚基类指针(vbptr) 这个指针指向一个虚基类表(vbtable)
虚基类表里记录一个数据:偏移量 通过这个偏移量可以让找到唯一的数据
using namespace std;
class Animal
{
public:
int m_age ;
};
//sheep 和 tuo 继承 Animal 类
//通过虚继承可以解决菱形继承的问题
//此时使用虚继承则Animal 就成为虚基类
//使用虚继承后会有一个虚基类指针(vbptr) 这个指针指向一个虚基类表(vbtable)
//虚基类表里记录一个数据:偏移量 通过这个偏移量可以让找到唯一的数据
class sheep:virtual public Animal{};
class tuo : virtual public Animal {};
class sheeptuo:public sheep ,public tuo{};
void test01()
{
sheeptuo s;
s.sheep::m_age = 11;
s.tuo::m_age = 22;
s.m_age = 12;
cout << "sheeptuo.m_age == " << s.sheep::m_age << endl; //菱形继承需要指定作用域
}
int main(void)
{
test01();
}