C/C++ 关于继承与多态笔记
继承的基本语法: 继承的目的就是用于提高代码的可用性,减少代码的重复内容,高效开发。
#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++ 关于继承与多态笔记的更多相关文章
- C#学习笔记7:多态是面向对象的三大特征(封装、继承、多态)之一
多态: 多态是面向对象的三大特征(封装.继承.多态)之一. 什么是多态? 一个对象表现出多种状态. 多态的实现方法: 1.虚方法: 2.抽象方法: 3.接口. PS:New 关键词可以隐藏父类的方法. ...
- Java学习笔记--继承和多态(中)
1.通过继承来开发超类(superclass) 2.使用super 关键词唤起超类的构造方法 3.在超类中覆盖方法 4.区分override和overload 5.在Object类中探索toStrin ...
- Java学习笔记 07 接口、继承与多态
一.类的继承 继承的好处 >>使整个程序架构具有一定的弹性,在程序中复用一些已经定义完善的类不仅可以减少软件开发周期,也可以提高软件的可维护性和可扩展性 继承的基本思想 >>基 ...
- C# 读书笔记之继承与多态
1.1继承与多态的基本概念 1.1.1 继承和多态 继承是面向对象程序设计的主要特征之一,允许重用现有类(基类,亦称超类.父类)去创建新类(子类,亦称派生类)的过程.子类将获取基类的所有非私有数据和行 ...
- Java学习笔记(三)——封装、继承、多态
一.封装 概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 实现步骤: 修改属性的可见性——设为private. 创建getter/se ...
- Java类的继承与多态特性-入门笔记
相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...
- (C/C++学习笔记) 十八. 继承和多态
十八. 继承和多态 ● 继承的概念 继承(inheritance): 以旧类为基础创建新类, 新类包含了旧类的数据成员和成员函数(除了构造函数和析构函数), 并且可以派生类中定义新成员. 形式: cl ...
- Java 学习笔记 ------第六章 继承与多态
本章学习目标: 了解继承的目的 了解继承与多态的关系 知道如何重新定义方法 认识java.lang.object 简介垃圾回收机制 一.继承 继承是java面向对象编程技术的一块基石,因为它允许创建分 ...
- c#笔记整理 关于继承与多态等
[ 塔 · 第 二 条 约 定 ] c#面向对象基础 整理private.protected.public.abstract等的异同 public 公有访问.不受任何限制. private 私有访问. ...
- java学习笔记(基础篇)—面向对象编程之封装、继承、多态
一. OOP中的基本概念 Java的编程语言是面向对象的,采用这种语言进行编程称为面向对象编程(Object-Oriented Programming, OOP), 它允许设计者将面向对象设计实现为一 ...
随机推荐
- Prometheus--PromQL
官方文档:https://prometheus.io/docs/introduction/overview/ 中文文档:https://prometheus.fuckcloudnative.io/ ...
- 深入浅出 WebRTC AEC(声学回声消除)
前言:近年来,音视频会议产品提升着工作协同的效率,在线教育产品突破着传统教育形式的种种限制,娱乐互动直播产品丰富着生活社交的多样性,背后都离不开音视频通信技术的优化与创新,其中音频信息内容传递的流畅性 ...
- OS | 银行家算法C语言实现
算法简介 银行家算法(Banker's Algorithm)是一个避免死锁( Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法.它以银行借贷 ...
- HDU - 2897 邂逅明下 (简单博弈)
题目链接: https://vjudge.net/problem/HDU-2897 题目大意: 就是现在一堆石子有n颗, 每次只能拿走p~q颗, 当剩余少于p颗的时候必须一次拿完 拿走最后一颗的人败 ...
- Java ConcurrentHashMap 高并发安全实现原理解析
本文首发于 vivo互联网技术 微信公众号链接:https://mp.weixin.qq.com/s/4sz6sTPvBigR_1g8piFxug作者:vivo 游戏技术团队 一.概述 Concurr ...
- vivo 悟空活动中台 - 栅格布局方案
本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/6O0CH0U_WE1YkPK75m-jDQ作者:悟空中台研发团队 一.背景 今天来给大家分享 ...
- ttf转eot
Webfont Generator https://www.fontsquirrel.com/tools/webfont-generator 使用@font-face显示web自定义字体,字体获取工具 ...
- shell脚本(9)-流程控制for
一.循环介绍 for循环叫做条件循环,或者for i in,可以通过for实现流程控制 二.for语法 1.for语法一:for in for var in value1 value2 ...... ...
- 开发了一个json格式化工具,使用js格式化json的代码分享
今天给大家介绍一下如何通过js来格式化json. 假设json字符串是: {"name":"刘德华","age":25.2,"bi ...
- 【VSCode】秒下vscode
有时从vscode官网下载速度奇慢甚至失败,介绍一种方法可以秒下 进入官网选择要下载的版本 像我的电脑,下载网址根本打不开 修改下载网址,替换下载地址中红框字符串:vscode.cdn.azure.c ...