3.0 C++远征:is a

作者: 青_阳 | 来源:发表于2016-11-18 18:27 被阅读2次

4-4is_a

0.派生类Soldier继承自基类Person

//Person.h
class Person
{
public:
    Person(string name = "Jim");
    ~Person();

    void play();
protected:
    string m_strName;
};

//Soldier.h
class Soldier : public Person
{
public:
    Soldier(string name = "James", int age = 20);

    ~Soldier();

    void work();
protected:
    int m_iAge;
};

1.派生类可以给基类赋值:

//main.cpp
int main(){
    Soldier s1;
    Person p1 = s1;
  
    return 0;
}

2.基类指针可以指向派生类(派生类可以取地址给基类):

//main.cpp
int main(){
    Soldier s1;
    Person *p2 = &s1;
  
    return 0;
}

3.把基类的指针或者是基类的对象或者是基类的引用作为函数的参数来使它可以接收所传入的子类的对象,并且也可以传入基类的对象

void func1(Person *p){
    ......
}

void func2(Person &p){
    ......
}

//main.cpp
int main(){
    Person p1;
    Soldier s1;
    func1(&p1);     func2(p1);
    func1(&s1);     func2(s1);
  
    return 0;
}

4.基类只能接收和访问派生类中自己有的数据成员和成员函数

//#include "Person.h"
# include "Soldier.h"

int main() {
    Soldier soldier;
    Person person;
    person = soldier;
    person.play();

    Person *p = &soldier;
    p->play();  // 使用基类声明的对象只能调用基类的方法
    //p->work();    // 使用基类声明的对象不能调用派生类的方法
  
    return 0;
}

5.通过基类的指针指向派生类的对象

//#include "Person.h"
#include "Soldier.h"

int main() {
    Person *pp = new Soldier;   // 基类的指针去指向派生类的内存空间
    pp->play();
    delete pp;  // 销毁基类的对象,执行的是基类的析构函数,派生类的内存并没有释放
    pp = NULL;
  
    return 0;
}
LOG:
Person::play()
James
Person::~Person()

6.为了防止内存的泄漏,此时需要用virtual关键字修饰析构函数。

virtual可以被继承

给基类的析构函数加一个关键字virtual,使销毁基类的对象时,可以释放派生类的对象的内存

//Person.h
class Person
{
public:
    Person(string name = "Jim");
    virtual ~Person();  // virtual关键字修饰析构函数

    void play();
protected:
    string m_strName;
};

LOG:
Person::play()
James
Soldier::~Soldier()
Person::~Person()

相关文章

  • 3.0 C++远征:is a

    4-4is_a 0.派生类Soldier继承自基类Person 1.派生类可以给基类赋值: 2.基类指针可以指向派...

  • 3.0 C++远征:模板

    模板 [TOC] 三、模板 1.为什么要引入模板? 使用模板的目的就是能够让程序员编写与类型无关的代码。 2.关键...

  • 3.0 C++远征:构造函数

    6-1构造函数 1.内存分区 2.对象结构 对象在被实例化之前,并不占用堆中或栈中的内存空间。 实例化的三个car...

  • 8-C++远征之继承篇-学习笔记

    C++远征之继承篇 开篇介绍 整个C++远征计划: 起航->离港->封装->继承 为什么要用继承? 为什么要有继承...

  • 5-C++远征之离港篇-学习笔记

    C++远征离港篇 离港总动员 C++远征计划的学习者肯定是冲着封装,继承,多态来的。 知识点: 指针 VS 引用 ...

  • 慕课网-C++远征之封装篇(下)-学习笔记

    C++远征之封装篇(下) c++封装概述 类 & 对象 对象+数据成员 = 对象成员 对象 + 数组 = 对象数组...

  • C++远征系列

    二、基础篇 三、封装篇 练习题1. 定义一个Student类,包含名字和年龄两个数据成员,实例化一个Student...

  • Opencv等比缩放图片 C++ | Python

    1.0 Python等比缩放图片 2.0 C++等比缩放图片 3.0 运行结果 Python结果显示C++结果显示...

  • Opencv读取图片 C++ | Python

    1.0 Python读取图片 2.0 C++读取图片 3.0 运行结果 Python结果显示C++结果显示 4.0...

  • 7-C++远征之封装篇[下]-学习笔记

    C++远征之封装篇(下) c++封装概述 下半篇依然围绕类 & 对象进行展开 将原本学过的简单元素融合成复杂的新知...

网友评论

    本文标题:3.0 C++远征:is a

    本文链接:https://www.haomeiwen.com/subject/teqspttx.html