【C++】多态-多态的基本语法
多态是C++面向对象三大特性之一
省流:
多态满足条件
有继承关系
子类重写父类中的虚函数
多态使用条件
父类指针或引用指向子类对象
*重写:函数返回值类型 函数名 参数列表 完全一致称为重写
分类 & 区别静态多态
函数重载 和 运算符重载属于静态多态,复用函数名
静态多态的函数地址早绑定 - 编译阶段确定函数地址
动态多态
派生类 和 虚函数实现运行时多态
动态多态的函数地址晚绑定 - 运行阶段确定函数地址
代码示例1234567891011121314151617181920212223242526272829303132333435#include<iostream>using namespace std;class Animal {public: virtual void speak() { //虚函数 cout << "动物在说话" << endl; }};class Cat :public Animal {public: vir ...
【C++】继承-同名静态成员处理
省流:与非静态成员处理方法一致
同名成员属性代码示例12345678910111213141516171819202122232425262728#include<iostream>using namespace std;class Base {public: static int m_A;};int Base::m_A = 100;class son :public Base {public: static int m_A;};int son::m_A = 200;int main() { son s; cout << "通过对象访问" << endl; cout << "son 下 m_A=" << s.m_A << endl; cout << "Base 下 m_A=" << s.Base::m_A << endl; cout << "通 ...
【C++】继承-多继承语法
省流:class 子类 : 继承方式 父类1, 继承方式 父类2...{};
C++中允许一个类继承多个类多继承可能会引发父类中有同名成员出现,需要加作用域
代码示例123456789101112131415161718192021222324252627282930313233343536#include<iostream>using namespace std;class Base1 {public: Base1() { m_A = 100; } int m_A;};class Base2 {public: Base2() { m_A = 200; } int m_A;};class son :public Base1, public Base2 {public: son() { m_C = 300; m_D = 400; } int m_C; int m_D;};int main() { son s; cou ...
【C++】继承-同名成员处理
省流
访问子类同名成员 直接访问即可
访问父类同名成员 需要加作用域
当子类与父类拥有同名的成员函数,子类会隐藏父类中的成员函数,加作用域可以访问到父类中的同名函数
同名成员属性代码示例1234567891011121314151617181920212223242526#include<iostream>using namespace std;class Base {public: Base() { m_A = 100; } int m_A;};class son :public Base {public: son() { m_A = 200; } int m_A;};int main() { son s; cout << "son 下 m_A= " << s.m_A << endl; cout << "Base 下 m_A= " << s.Base::m_A << ...
【C++】继承-继承中的对象模型
省流:父类中私有成员也是被子类继承下去了,只是由编译器给隐藏后访问不到
父类中所有非静态成员属性都会被子类继承下去
验证环境:为搜死丢丢2022 & win11
打开x64 Native Tools Command Prompt for VS 2022
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253************************************************************************ Visual Studio 2022 Developer Command Prompt v17.3.0** Copyright (c) 2022 Microsoft Corporation**********************************************************************[vcvarsall.bat] Environment ini ...
【C++】继承-构造和析构顺序
子类继承父类后,当创建子类对象,也会调用父类的构造函数
省流:先构造父类,再构造子类;析构顺序与构造相反
代码示例12345678910111213141516171819202122232425262728#include<iostream>using namespace std;class Base {public: Base() { cout << "Base的构造函数" << endl; } ~Base(){ cout << "Base的析构函数" << endl; }};class son :public Base {public: son() { cout << "son的构造函数" << endl; } ~son() { cout << "son的析构函数" << endl ...
【C++】继承-继承方式
继承方式
继承方式一共有三种
公共继承
保护继承
私有继承
不同的继承方式会影响基类(父类)成员在派生类(子类)中的访问权限
公共(public)继承方式
基类中所有 public 成员在派生类中为 public 属性
基类中所有 protected 成员在派生类中为 protected 属性
基类中所有 private 成员在派生类中不能使用
保护(protected)继承方式
基类中的所有 public 成员在派生类中为 protected 属性
基类中的所有 protected 成员在派生类中为 protected 属性
基类中的所有 private 成员在派生类中不能使用
私有(private)继承方式
基类中的所有 public 成员在派生类中均为 private 属性
基类中的所有 protected 成员在派生类中均为 private 属性
基类中的所有 private 成员在派生类中不能使用
表格
继承方式
public成员
protected成员
private成员
public继承
public
protect
无法访问
prote ...
【C++】继承-基本语法
继承的好处
减少重复代码
语法 class A:public B;
A类称为子类 或 派生类
B类称为父类 或基类
代码1234567891011121314151617181920212223242526272829303132class BasePage {public: void header() { cout << "首页、公开课、登录、注册" << endl; } void footer() { cout << "帮助中心、交流合作、站内地图" << endl; } void left() { cout << "Java、Python、C++、...(公共分类列表)" << endl; }};class Java :public BasePage {public: void content() { cout < ...
【C++】运算符重载-关系
作用
重载关系运算符,可以让两个自定义类型对象进行滴对比操作
代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546#include <iostream>using namespace std;class Person {public: Person(string name, int age) { this->name = name; this->age = age; } bool operator==(Person& p) { if (this->age == p.age && this->name == p.name) { return true; } return false; } bool operator!=(Person& p) { if (this->age == p.age && ...
【C++】运算符重载-函数调用
作用
函数调用运算符()也可以重载
由于重载后使用的方式非常像函数的调用,因此称为仿函数
仿函数没有固定写法,非常灵活
代码1234567891011121314151617181920212223242526272829303132333435363738#include <iostream>using namespace std;class MyPrint {public: void operator()(string text) { cout << text << endl; }};class MyAdd {public: int operator()(int a,int b) { return a + b; }};void test01() { MyPrint myPrint; myPrint("Hello World");}void test02() { MyAdd add; int ret = add(1 ...