欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

继承

程序员文章站 2022-06-19 21:17:47
...

c++中什么是继承?

先上一段代码:

class Parent {
public:
   void f1() {
        std::cout << "f1()" << std::endl;
    }
private:
    int _a;
    int _b;
};

class Child : Parent{
public:
   void f2() {
        std::cout << "f2()" << std::endl;
    }
private:
   int c;
};

 

        在以上代码中,Child 类继承了Parent类,我们把Parent类叫做基类(父类),把Child类叫做派生类(子类),Child不但拥有自己的成员函数发f2和成员变量c,由于继承了Parent类,Child类也拥有Parent类的成员函数和成员变量,在实例化Child的对象时,线调用Parent的构造函数,再调用Child的构造函数,可能会有点困惑,这是为什么呢?单独理解确实让人不解,但是,如何对派生类对象中从基类继承来的私有对像赋值呢?,直接再派生类的构造函数中用等号进行赋值吗?显然不可以,我们只能调用基类的构造函数对基类的成员进行初始化,如果不手动掉构造函数,编译器就会自动调基类的默认构造函数(不用传参数的构造函数),如果手动调用该了构造函数,编译器不再自动调用。

三种在继承方式

  • 共有继承

  • 私有继承

  • 保护继承

保护成员限定符:一些基类成员不想被基类的对象直接访问,但需要在派生类中才能访问,就定义为保护成员。保护成员限定符是因继承才出现的。

关系:若基类的成员函数为私有,则派生类对基类的私有成员是不可见的,其他的标准为选范围小的为最终访问限定, 怎么理解?看下表:

继承

 

struct默认时共有继承,class默认时私有继承,所以上面代码中基类的所有成员对派生类来说都是私有的,想要调用基类的成员函数怎么办?修改继承方式!

class Child : public Parent{     //加上public之后就变成了共有继承
public:
   void f2() {
        std::cout << "f2()" << std::endl;
    }
private:
   int c;
};

 

继承与转换--赋值兼容规则--public继承

  1. 子类对象可以赋值给父类对象(切割/切片)

  2. 父类对象不能赋值给子类对象

  3. 父类的指针/引用可以指向子类对

  4. 子类的指针/引用不能指向父类对象(可以通过强制类型转换完成)

第1、2条的原因是,子类对象拥有父类对象的所有成员变量,拥有给父类对象赋值的能力,多余的数据自然的舍弃,不做操作,但是反过来,父类对象并没有完整的子类对象的数据,所以不能赋值

第3、4条的原因是,父类的指针看到的空间比子类指针看到的空间小,父类的指针/引用指向子类,子类的开头是父类的数据,刚好可以看作一个父类对象,反过来,子类对象的指针/引用看到的空间比一个父类对象的大小还要大,当子类指针/引用指向一个父类对象时,指针/引用看的的一部分空间时非法的,当然不能赋值。

派生类的六个默认成员函数 

在继承关系里面,在派生类中如果没有显示定义这六个成员函数,编译系统则会默认合成这六个默认的成员函数。

 

继承

 

构造函数(构造函数和析构函数):一个基类对象,会从他最初的基类开始构造,一层一层的直到调用了里自己类内的构造函数,才算构造完成,如果不给基类的构造函数传参数,就调用基类的无参构造函数,如果没有无参构造函数,则编译不过。

析构函数:构造函数会从基类开始调用构造函数,整个过程调用了多次构造函数,析构也自然析构多次,遵循后构造的先析构原则        

赋值的重载:与继承无关,系统生成的默认赋值也是对象中的内容拷贝到另一个对象,只会调用当前类内的赋值,不会调用基类的赋值

取地址符重载:与继承无关,取到当前对象的地址