继承的基本语法: 继承的目的就是用于提高代码的可用性,减少代码的重复内容,高效开发。

#include <iostream>

using namespace std;

class BasePage
{
private:
int m_x; protected:
int m_y; public:
void header() { cout << "header" << endl; }
void footer() { cout << "footer" << endl; }
}; // 新建一个News类,以公有属性继承BasePage类中的内容
class News :public BasePage
{
public:
void connect() { cout << "connect" << endl; }
}; int main(int argc, char *argv[])
{
News news;
news.header();
news.footer(); system("pause");
return 0;
}

继承中的构造/析构函数:

#include <iostream>

using namespace std;

class BasePage
{
public:
BasePage(){ cout << "base page -> start" << endl; }
~BasePage(){ cout << "base page -> end" << endl; }
}; class News :public BasePage
{
public:
News(){ cout << "news page -> start" << endl; }
~News(){ cout << "news page -> end" << endl; }
}; void call()
{ // 此处如果初始化写在main中,将无法看到析构函数的执行
News news;
} int main(int argc, char *argv[])
{
call();
system("pause");
return 0;
}

继承下的同名函数调用:

#include <iostream>

using namespace std;

class BasePage
{
public:
void func(int x, int y)
{
cout << "BasePage -> " << x + y << endl;
}
}; class News :public BasePage
{
public:
void func(int x, int y)
{
cout << "News -> " << x + y << endl;
}
}; int main(int argc, char *argv[])
{
News news; // 如果想调用父类的func()则需要
news.BasePage::func(10,20); // 调用子类的则是
news.func(100, 200); system("pause");
return 0;
}

继承下的静态成员属性:

#include <iostream>

using namespace std;

class BasePage
{
public:
static int m_x; public:
static void func(int x, int y) {cout << "BasePage -> " << x + y << endl;}
}; class News :public BasePage
{
public:
static int m_x; public:
static void func(int x, int y) {cout << "News -> " << x + y << endl;}
}; int BasePage::m_x = 100;
int News::m_x = 200; int main(int argc, char *argv[])
{
News news; cout << News::m_x << endl;
cout << News::BasePage::m_x << endl; News::func(10,20);
News::BasePage::func(100,200); system("pause");
return 0;
}

多继承的调用:

#include <iostream>

using namespace std;

class Base1
{
public:
int m_x;
public:
Base1(){ m_x = 10; }
void show() { cout << m_x << endl; }
}; class Base2
{
public:
int m_x;
public:
Base2(){ m_x = 20; }
void show() { cout << m_x << endl; }
}; class Super :public Base1, public Base2
{
public:
int m_y;
public:
Super(){ m_y = 30; }
void display(){ cout << m_y << endl; }
}; int main(int argc, char *argv[])
{
Super super; cout << super.Base1::m_x << endl;
cout << super.Base2::m_x << endl;
cout << super.m_y << endl; super.Base1::show();
super.display(); system("pause");
return 0;
}

菱形继承(虚继承): 盖继承,可能会出现多个基类中存在相同的成员数据,这样会造成,内存开销。虚基类即可实现解决共享的开销问题。

#include <iostream>

using namespace std;

class Animal
{
public:
int m_Age;
}; // 虚基类 Sheep
class Sheep :virtual public Animal { }; // 虚基类 Tuo
class Tuo :virtual public Animal { }; // 定义派生类
class SheepTuo :public Sheep, public Tuo { }; int main(int argc, char *argv[])
{
SheepTuo ptr; ptr.Sheep::m_Age = 10;
ptr.Tuo::m_Age = 20; cout << ptr.Sheep::m_Age << endl;
cout << ptr.Tuo::m_Age << endl;
cout << ptr.m_Age << endl; system("pause");
return 0;
}

虚函数实现动态多态: 动态多态,实现了,根据传递的指针不同,调用同一个接口,返回不同的结果。

#include<iostream>

using namespace std;

class Animal
{
public:
virtual void speak() { cout << "Animal speak" << endl; }
virtual void eat() { cout << "Animal eat" << endl; }
}; class Cat :public Animal
{
public:
void speak() { cout << "Cat speak" << endl; }
virtual void eat() { cout << "cat eat" << endl; }
}; class Dog :public Animal
{
public:
void speak() { cout << "Dog speak" << endl; }
virtual void eat() { cout << "dog eat" << endl; }
}; void doSpeak(Animal & animal)
{
animal.speak();
} int main(int argc, char *argv[])
{
Cat cat_ptr;
doSpeak(cat_ptr); // 调用同一个函数,返回不同的结果 Dog dog_ptr;
doSpeak(dog_ptr); system("pause");
return EXIT_SUCCESS;
}

纯虚函数实现多态: 如果父类中有了纯虚函数,子类继承父类就必须要实现纯虚函数。父类中存在纯虚函数,该类无法实例化对象,只能被继承后实现,这种类被叫做抽象类。多态设计原则,开闭原则。

#include <iostream>

using namespace std;

class AbstractCalculator
{
public:
int x;
int y; public:
// virtual int getResult() { return 0; }; // 定义虚函数
virtual int getResult() = 0; // 定义纯虚函数
void Set_Val(int x, int y){ this->x = x; this->y = y; };
}; class AddCalculator :public AbstractCalculator
{
public:
virtual int getResult() // 扩展getResult方法
{
return x + y;
}
}; class SubCalculator :public AbstractCalculator
{
public:
virtual int getResult()
{
return x - y;
}
}; int main(int argc, char *argv[])
{
AbstractCalculator *ptr = new AddCalculator; // 创建一个加法
ptr->Set_Val(10, 20);
cout << "x+y = " << ptr->getResult() << endl;
delete ptr; ptr = new SubCalculator; // 创建一个减法
ptr->Set_Val(10, 20);
cout << "x-y = " << ptr->getResult() << endl;
delete ptr; system("pause");
return 0;
}

实现虚析构: 在基类的析构函数上加上virtual修饰为虚析构函数,这样就能让派生类的元素进行释放了。

解决父类指针,释放子类对象是,释放不干净的问题。

普通析构 是不会调用子类的析构的,所以可能会导致释放不干净,利用虚析构来解决这个问题

#include <iostream>

using namespace std;

class Animal
{
public:
// 此处加上virtual声明为虚析构函数
virtual ~Animal() { cout << "Animal back" << endl; }
}; class Cat :public Animal
{
public:
char *m_name; public:
Cat(const char *name)
{
this->m_name = new char[strlen(name) + 1];
strcpy(this->m_name, name);
}
~Cat()
{
cout << "Cat back" << endl;
if (this->m_name != NULL)
{
delete[] this->m_name;
this->m_name = NULL;
}
}
}; int main(int argc, char *argv[])
{
Animal *ptr = new Cat("Tomcat");
delete ptr;
system("pause");
return 0;
}

实现纯虚析构: 纯虚析构函数,必须要存在实现,实现必须在类外进行实现,因为类内无法实现。

如果函数中出现了 纯虚析构函数,那么这个类也算抽象类,抽象类 不可实例化对象

#include <iostream>

using namespace std;

class Animal
{
public:
// 此处加上 virtual 声明为纯虚析构函数
virtual ~Animal() = 0 ;
}; Animal::~Animal()
{
// 纯虚析构函数实现
cout << "Animal back" << endl;
} class Cat :public Animal
{
public:
char *m_name; public:
Cat(const char *name)
{
this->m_name = new char[strlen(name) + 1];
strcpy(this->m_name, name);
}
~Cat()
{
cout << "Cat back" << endl;
if (this->m_name != NULL)
{
delete[] this->m_name;
this->m_name = NULL;
}
}
}; int main(int argc, char *argv[])
{
Animal *ptr = new Cat("Tomcat");
delete ptr;
system("pause");
return 0;
}

C/C++ 关于继承与多态笔记的更多相关文章

  1. C#学习笔记7:多态是面向对象的三大特征(封装、继承、多态)之一

    多态: 多态是面向对象的三大特征(封装.继承.多态)之一. 什么是多态? 一个对象表现出多种状态. 多态的实现方法: 1.虚方法: 2.抽象方法: 3.接口. PS:New 关键词可以隐藏父类的方法. ...

  2. Java学习笔记--继承和多态(中)

    1.通过继承来开发超类(superclass) 2.使用super 关键词唤起超类的构造方法 3.在超类中覆盖方法 4.区分override和overload 5.在Object类中探索toStrin ...

  3. Java学习笔记 07 接口、继承与多态

    一.类的继承 继承的好处 >>使整个程序架构具有一定的弹性,在程序中复用一些已经定义完善的类不仅可以减少软件开发周期,也可以提高软件的可维护性和可扩展性 继承的基本思想 >>基 ...

  4. C# 读书笔记之继承与多态

    1.1继承与多态的基本概念 1.1.1 继承和多态 继承是面向对象程序设计的主要特征之一,允许重用现有类(基类,亦称超类.父类)去创建新类(子类,亦称派生类)的过程.子类将获取基类的所有非私有数据和行 ...

  5. Java学习笔记(三)——封装、继承、多态

    一.封装 概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 实现步骤: 修改属性的可见性——设为private. 创建getter/se ...

  6. Java类的继承与多态特性-入门笔记

    相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...

  7. (C/C++学习笔记) 十八. 继承和多态

    十八. 继承和多态 ● 继承的概念 继承(inheritance): 以旧类为基础创建新类, 新类包含了旧类的数据成员和成员函数(除了构造函数和析构函数), 并且可以派生类中定义新成员. 形式: cl ...

  8. Java 学习笔记 ------第六章 继承与多态

    本章学习目标: 了解继承的目的 了解继承与多态的关系 知道如何重新定义方法 认识java.lang.object 简介垃圾回收机制 一.继承 继承是java面向对象编程技术的一块基石,因为它允许创建分 ...

  9. c#笔记整理 关于继承与多态等

    [ 塔 · 第 二 条 约 定 ] c#面向对象基础 整理private.protected.public.abstract等的异同 public 公有访问.不受任何限制. private 私有访问. ...

  10. java学习笔记(基础篇)—面向对象编程之封装、继承、多态

    一. OOP中的基本概念 Java的编程语言是面向对象的,采用这种语言进行编程称为面向对象编程(Object-Oriented Programming, OOP), 它允许设计者将面向对象设计实现为一 ...

随机推荐

  1. Prometheus--PromQL

    官方文档:https://prometheus.io/docs/introduction/overview/  中文文档:https://prometheus.fuckcloudnative.io/ ...

  2. 深入浅出 WebRTC AEC(声学回声消除)

    前言:近年来,音视频会议产品提升着工作协同的效率,在线教育产品突破着传统教育形式的种种限制,娱乐互动直播产品丰富着生活社交的多样性,背后都离不开音视频通信技术的优化与创新,其中音频信息内容传递的流畅性 ...

  3. OS | 银行家算法C语言实现

    算法简介 银行家算法(Banker's Algorithm)是一个避免死锁( Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法.它以银行借贷 ...

  4. HDU - 2897 邂逅明下 (简单博弈)

    题目链接: https://vjudge.net/problem/HDU-2897 题目大意: 就是现在一堆石子有n颗, 每次只能拿走p~q颗, 当剩余少于p颗的时候必须一次拿完 拿走最后一颗的人败 ...

  5. Java ConcurrentHashMap 高并发安全实现原理解析

    本文首发于 vivo互联网技术 微信公众号链接:https://mp.weixin.qq.com/s/4sz6sTPvBigR_1g8piFxug作者:vivo 游戏技术团队 一.概述 Concurr ...

  6. vivo 悟空活动中台 - 栅格布局方案

    本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/6O0CH0U_WE1YkPK75m-jDQ作者:悟空中台研发团队 一.背景 今天来给大家分享 ...

  7. ttf转eot

    Webfont Generator https://www.fontsquirrel.com/tools/webfont-generator 使用@font-face显示web自定义字体,字体获取工具 ...

  8. shell脚本(9)-流程控制for

    一.循环介绍 for循环叫做条件循环,或者for i in,可以通过for实现流程控制 二.for语法 1.for语法一:for in for var in value1 value2 ...... ...

  9. 开发了一个json格式化工具,使用js格式化json的代码分享

    今天给大家介绍一下如何通过js来格式化json. 假设json字符串是: {"name":"刘德华","age":25.2,"bi ...

  10. 【VSCode】秒下vscode

    有时从vscode官网下载速度奇慢甚至失败,介绍一种方法可以秒下 进入官网选择要下载的版本 像我的电脑,下载网址根本打不开 修改下载网址,替换下载地址中红框字符串:vscode.cdn.azure.c ...