继承的基本语法
class 特殊的类 : public 公共的类
{
};
不用继承
#include <iostream>
using namespace std;
class Java
{
public:
void header()
{
cout << "首页,公开课,登录,注册.....(公共头部)" << endl;
}
void footer()
{
cout << "帮助中心,交流合作,站内地图,....(公共底部)" << endl;
}
void left()
{
cout << "Java ,Python, c++, ....(公共信息列表)" << endl;
}
void content()
{
cout << "Java学科视频" << endl;
}
};
void test01()
{
cout << "Java的下载页面如下" << endl;
Java ja;
ja.header();
ja.footer();
ja.left();
ja.content();
}
class Python
{
};
- void test01()
{
cout << "Java的下载页面如下" << endl;
Java ja;
ja.header();
ja.footer();
ja.left();
ja.content();
}
int main()
{
test01();
return 0;
}
class BasePage
{
public:
void header()
{
cout << "首页,公开课,登录,注册.....(公共头部)" << endl;
}
void footer()
{
cout << "帮助中心,交流合作,站内地图,....(公共底部)" << endl;
}
void left()
{
cout << "Java ,Python, c++, ....(公共信息列表)" << endl;
}
};
class Java : public BasePage
{
public:
void content()
{
cout << "java学科视频" << endl;
}
};
class Python : public BasePage
{
public:
void content()
{
cout << "Python学科视频" << endl;
}
};
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();
}
继承方式
- 公共继承
- 保护继承
- 私有继承
- 继承的规则:
- public 继承,父类的成员访问权限是怎么样,到子类中还是怎么样
- protected 继承,父类的公共和保护成员,到子类中变为了保护权限的变量
- private 继承,父类的成员的公共和保护访问权限,到子类中全变为私有权限
- 不论哪种继承方式,都不能访问父类中的私有权限的成员变量
- 子类以私有继承的方式继承了父类的变量,然后孙子类又以公共权限继承它的父类。这种情况下,孙子类不能访问父类中的成员变量,因为它的父类在继承爷爷类的时候采取了私有继承,所以此时父类中的成员变量已经变为了私有权限,孙子类虽然以公共权限继承,但无法访问父类中的私有权限成员变量。
继承中的对象模型
- 父类中的私有成员变量也会被子类继承,但是隐藏了。
- 所以我们用sizeof来计算子类的大小时会包括父类的私有成员变量的大小
#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;
};
void test01()
{
cout << "size of Son = " << sizeof(Son) << endl;
}
int main()
{
test01();
return 0;
}
size of Son = 16
继承中的构造和析构顺序
#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 s1;
}
int main()
{
test01();
system("pause");
return 0;
}
Base构造函数
Son的构造函数
Son的析构函数
Base的析构函数
- 继承中的构造和析构顺序如下:
先构造父类在构造子类,析构的顺序与构造的顺序相反
同名成员处理
- 在访问子类和父类的同名成员变量时,通过子类对象访问父类成员需要加作用域才能访问,否则默认访问的是子类中的成员变量
多继承
- 语法: class 子类 : 继承方式 父类1, 继承方式 父类2…
- 当父类中出现同名成员需要加作用域区分
#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 test01()
{
Son s;
cout << "sizeof Son = " << sizeof (Son) << endl;
cout << "Base1 : m_A = " << s.Base1::m_A << endl;
cout << "Base2 : m_A = " << s.Base2::m_A << endl;
}
int main()
{
test01();
return 0;
}
菱形继承
- 利用虚继承,解决菱形继承问题
- 继承之前加上关键字virtual 变为虚继承
- Animal类称为虚基类
#include <iostream>
using namespace std;
class Animal
{
public:
int m_Age;
};
class Sheep : virtual public Animal{};
class Tuo : public virtual Animal{};
class SheepTuo : public Sheep, public Tuo{};
void test01()
{
SheepTuo st;
st.Sheep::m_Age = 18;
st.Tuo::m_Age = 27;
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();
return 0;
}