C++继承
一 什么是继承
定义
继承(inheritance)是面向对象的三大特性之一 ,可以使代码复用的重要手段,我们可以在原来类的基础上添加新的功能和特性。继承的叫派生类或子类,被继承的叫父类或基类。
代码如下
//class 子类 : 继承方式 父类 继承的语法
#include <iostream>
using namespace std;
class people
{
public:
int age;
};
class student
{
};
//公共 父类中公共和保护的内容变成子类中公共的内容
class student : public people
{
};
//保护 父类中公共和保护的内容变成子类中保护的内容
class student : protected people
{
};
//私有 父类中公共和保护的内容变成子类中私有的内容
class student : private people
{
};
注意事项
父类中的所有非静态成员属性都会被子类继承
在继承中 私有成员我们也是继承了的 但是我们在子类中无法访问
二 子类和父类
一 子类和父类成员变量和函数同名时,如何通过子类对象访问父类成员变量和函数
直接看代码
class Father
{
public:
int age;
void Func()
{
}
static void S()
{
}
};
class Son : public Father
{
public:
int age;
void Func()
{
}
static void S()
{
}
};
int main()
{
Son s;
cout << s.Father::age << endl;//加个作用域就可以通过子类对象访问父类成员变量
s.Father::Func();//函数也同理 加个作用域就可以通过子类对象访问父类成员函数
//如果不加作用域的话 很可能就屏蔽掉父类同名的成员函数
//非静态是加作用域通过子类对象进行调用
Son::S(); //访问静态的成员变量和函数 可以通过类名调用
Son::Father::S();//访问父类中静态的成员变量和函数 可以通过类名调用 也是加作用域
二 多继承
直接看代码
class A
{
public:
int a;
};
class B
{
public:
int b;
};
//多继承的语法就是 加逗号隔开父类
//如果是多继承 一个子类对象所占内存应该是所有父类内存的和
//这个子类对象内存就是8
class Son : public A, public B
{
};
//这里有一个需要注意的点 如果继承的两个父类有同名的函数和变量 还是要加作用域用于区分
void test()
{
Son s;
cout<< s.A::a << endl;
}
注意!!!
在实际开发不太建议使用 加作用域比较麻烦
三 菱形继承
一 概念
菱形继承就是两个子类继承于一个父类,又有一个类同时继承这两个子类,这种继承叫做菱形继承
比如 狼类和狗类是子类继承于父类动物类 狼狗作为子类继承于狼和狗类 就是一个菱形 叫做菱形继承
关系如下图
注意!! 存在问题
存在二义性 比如都有的属性 年龄 继承时会继承两份数据 但是我们只需要一份
二 虚继承
因为二义性 所以我们引入概念——虚继承
class Animal
{
public:
int m_age;
};
class Wolf : virtual public Animal{};//虚继承 父类就叫做虚基类
class Dog : virtual public Animal{};//通过虚继承来解决二义性
class WD : public Wolf, public Dog{};
void test()
{
WD wd;
wd.Wolf::m_age = 10;
wd.Dog::m_age = 20;
cout << "狼的age:" << wd.Wolf::m_age << endl;
cout << "狗的age:" <<wd.Dog::m_age << endl;
cout << "狼狗的age:" <<wd.m_age << endl;
}
程序结果如下