C++ 复习 -- 多态

【C++面向对象程序设计期末复习】——多态 为不同数据类型的实体提供统一的接口,或使用单一符号表示多种类型。 阅读详情


多态的基本概念(polymorphic)

想象一下,你有一个遥控器(这就像是一个基类的指针),这个遥控器可以控制不同的电子设备这些设备就像是派生类)。无论是电视、音响还是灯光,遥控器上的“开/关”按钮(这个按钮就像是一个虚函数)都能控制它们,但具体的操作(打开电视、播放音乐、开灯)则取决于你指向的设备。

如何实现多态

1. 使用虚函数(Virtual Function):
我们在基类中定义一个虚函数,这个函数可以在任何派生类中被“重写”或者说“定制”。
使用关键字 virtual 来声明。


2. 创建派生类并重写虚函数:
在派生类中,我们提供该虚函数的具体实现。这就像是告诉遥控器,“当你控制我的这个设备
时,这个按钮应该这样工作”。


3. 通过基类的引用或指针调用虚函数:
当我们使用基类类型的指针或引用来调用虚函数时,实际调用的是对象的实际类型(派生类)中的函数版本

=======================================

case

#include <iostream>

using namespace std;


class RemoteCon{
public:
    void virtual openUtils(){
       cout<<"遥控器的开关呗按下"<<endl;
    }

};

class TVRemoteCon: public RemoteCon{
public:
    void openUtils() override{
    cout<<"电视遥控器的开呗按下"<<endl;
    }
    void test(){};

};

class RoundspeakCon: public RemoteCon{
public:
    void openUtils() override{
    cout<<"音响遥控器的开呗按下"<<endl;
    }

};


class LightCon: public RemoteCon{
public:
    void openUtils() override{
    cout<<"灯光遥控器的开呗按下"<<endl;
    }

};

void  testY(RemoteCon& r)
{
r.openUtils();
}

int main()
{
  RemoteCon * remoteCon =  new TVRemoteCon;
  remoteCon->openUtils();
  //remoteCon->test(); // 调用不到 --> 没实现多态 -->子类对基类的函数重载

  RemoteCon * remoteCon2 =  new RoundspeakCon;
  remoteCon2->openUtils();


  RemoteCon * remoteCon3 =  new LightCon;
  remoteCon3->openUtils();
  TVRemoteCon tvRemote;
  testY(tvRemote);

    return 0;
}


 


为什么使用多态


灵活性:允许我们编写可以处理不确定类型的对象的代码。
可扩展性:我们可以添加新的派生类而不必修改使用基类引用或指针的代码。
接口与实现分离:我们可以设计一个稳定的接口,而将具体的实现留给派生类去处理。


========================================

抽象类:

纯虚函数: -->不能被调用
 void virtual openUtils()=0;


抽象类的基本概念


想象一下,你有一个“交通工具”的概念。这个概念告诉你所有交通工具都应该能做什么,比如移动(move),但它并不具体说明怎么移动。对于不同的交通工具,比如汽车和自行车,它们的移动方式是不同的。在这个意义上,“交通工具”是一个抽象的概念,因为它本身并不能直接被使用。你需要一个具体的交通工具,比如“汽车”或“自行车”,它们根据“交通工具”的概念具体实现了移动的功能。


在 C++ 中,抽象类就像是这样的一个抽象概念。它定义了一组方法(比如移动),但这些方法可能没有具体的实现。这意味着,抽象类定义了派生类应该具有的功能,但不完全实现这些功能

抽象类的特点


1. 包含至少一个纯虚函数:
抽象类至少有一个纯虚函数。这是一种特殊的虚函数,在抽象类中没有具体实现,而是留给派生类去实现。纯虚函数的声明方式是在函数声明的末尾加上 = 0 。


2. 不能直接实例化:
由于抽象类不完整,所以不能直接创建它的对象。就像你不能直接使用“交通工具”的概念去任何地方,你需要一个具体的交通工具。


3. 用于提供基础结构:
抽象类的主要目的是为派生类提供一个共同的基础结构,确保所有派生类都有一致的接口和行为。

case

// 注意:  继承抽象类的子类必须全部 初始化基类的纯虚函数  ,不然也不能被实例化

#include <iostream>
//#include<string>

using namespace std;

class Teacher{
public:
 string name;
 int age;
 string subject;
 virtual void goInClass() =0;
 virtual void startTeaching() =0;
 virtual void overTeaching() =0;
};

class EnglishTeacher :public Teacher{
public:
    void goInClass()override{
        cout<<"英语老师快乐的进入教室"<<endl;
    }

    void startTeaching()override{
        cout<<"英语老师开始上课"<<endl;
    }

    void overTeaching()override{

    }

};

class MathTeacher :public Teacher{
public:
    void goInClass()override{
        cout<<"数学老师严肃的进入教室"<<endl;
    }

    void startTeaching()override{
        cout<<"数学老师开始算数"<<endl;
    }

    void overTeaching()override{
     cout<<"数学老师要拖堂了"<<endl;
    }

};

int main()
{
EnglishTeacher e;
e.goInClass();

//抽象类也支持多天
Teacher *t = new MathTeacher;
t->overTeaching();
    return 0;
}


 

接口:

概念

纯虚函数-接口
在 C++ 中,虽然没有像其他编程语言(比如 Java 中的接口Interface)一样直接定义接口的关键字,但可以通过抽象类和纯虚函数的方式来实现接口的概念。
接口通常用于定义类应该实现的方法,但不提供具体实现。这样的实现方式允许多个类共享相同的接口,同时让每个类根据需要去实现这些接口。

实现步骤

一个类作为接口可以通过以下步骤来实现:

1. 定义抽象类:创建一个包含纯虚函数的抽象类,这些函数构成了接口的一部分。这些函数在抽象类中只有声明而没有具体的实现。
2. 派生类实现接口:派生类继承抽象类,并实现其中的纯虚函数,以具体实现接口定义的方法。

// 其实接口还是 抽象类 --> 针对行为实现


#include <iostream>
using namespace std;
class BasketBallMove{
public:
virtual void passTheBall() = 0;
};
class LiveMove{
public:
virtual void eat() = 0;
virtual void bite() = 0;
virtual void drink() = 0;
virtual void la() = 0;
};
class Human : public LiveMove,BasketBallMove{
public:
void eat() override{};
void bite() override{};
void drink() override{};
void la() override{};
void passTheBall() override{};
};
class Dog : public LiveMove{
public:
void eat() override{};
void bite() override{};
void drink() override{};
void la() override{};
};
int main()
{
Human h;
Dog g;
// LiveMove *l = new LiveMove;
return 0;
}

Qt/C++抽象类和纯虚函数讲解示例源代码 该资源是博主博客的源代码,博客上有详细讲解Qt/C++关于纯虚函数和抽象基类原理讲解和示例用法解释,博客地址如下: https://blog.youkuaiyun.com/naibozhuan3744/article/details/94488200 其中编译环境为QtCreator4.5.0(qt5.9.4),用MinGW32位编译器编译。 立即下载

相关推荐

保姆级教程:在Windows/Mac上从零部署清华Kronos股票预测模型(含Qlib数据更新避坑指南)

本文提供了一份详细的指南,帮助用户在Windows和Mac系统上从零部署清华Kronos股票预测模型,包括环境配置、模型权重获取、Qlib数据更新避坑等关键步骤。特别针对国内用户遇到的网络问题和数据更新不及时提供了解决方案,适合量化投资和金融科技爱好者快速上手。

weixin_29053577的博客 623

纯虚函数和抽象类

语法格式:virtual 返回值类型 函数名 (函数参数) = 0; 含有纯虚函数的类为抽象类。 注意点:抽象类不能常见对象:因为纯虚数没有函数体,不是完整的函数,无法调用,因此无法实例化。抽象函数一般用来作为基类,让派生类去实现虚函数。 在这个抽象类中,如果有其他不是虚函数的成员函数,那么只要定义一个基类指针指向派生类,就可以直接调用这些正常的成员函数。抽象类与虚函数的说明:1) 一个纯虚函数就...

qcz_nuist的博客 924

2026软件测试面试题全解析:从用例设计到接口自动化与性能实战

在软件测试岗位的招聘考察中,面试官越来越看重候选人解决实际问题的工程能力,而不仅仅是背诵概念。从最基础的测试用例设计出发,覆盖功能测试、接口测试、自动化测试、性能测试、数据库与Redis一致性等核心知识体系,是应对中高级岗位面试的关键路径。理解Postman抓包、Python脚本、Pytest框架、JMeter压测指标背后的原理,能帮助测试人员构建完整的质量保障思维。当AI辅助测试成为行业新趋势时,掌握数据校验链路与风险识别意识,更能体现资深测试工程师的竞争力。本文围绕2026年高频软件测试面试题,梳理了从

weixin_28676289的博客 245

QT学习(七)C++多态、抽象类、接口

想象一下,你有一个遥控器(这就像是一个基类的指针),这个遥控器可以控制不同的电子设备(这些设备就像是派生类)。按钮(这个按钮就像是一个虚函数)都能控制它们,但具体的操作(打开电视、播放音乐、开灯)则取决于你指向的设备。对于不同的交通工具,比如汽车和自行车,它们的移动方式是不同的。当我们使用基类类型的指针或引用来调用虚函数时,实际调用的是对象的实际类型(派生类))一样直接定义接口的关键字,但可以通过抽象类和纯虚函数的方式来实现接口的概念。:派生类继承抽象类,并实现其中的纯虚函数,以具体实现接口定义的方法。

ryh2004812的博客 1720

华硕笔记本+Ubuntu 20.04:用cpupower解决Intel CPU频率上不去/功耗墙问题实战

本文详细介绍了在华硕笔记本Ubuntu 20.04系统下使用cpupower工具解决Intel CPU频率受限和功耗墙问题的实战方法。通过禁用Intel P-State驱动、配置userspace模式以及高级调优技巧,帮助用户突破性能瓶颈,提升编译和计算效率。

weixin_42561476的博客 525

Zynq-PS-SDK(12) 之 VDMA+VTC+AXI4S-VideoOut 视频通路硬件搭建

前面分别叙述了《Zynq-PS-SDK(9) 之 VDMA》、《Zynq-PS-SDK(10) 之 VTC》以及《Zynq-PS-SDK(11) 之 AXI4-Stream To Video Out》;搭建一个简单的视频通路(Framebuffer -> HDMI)就要用到这些个模块,总体的设计框图如下所示: 视频数据的 Framebuffer 在 DDR 中,通过 Processing System 写入进去; 数据通过高带宽的 AXI4 接口(这里用到了 HP AXI,即 64bits 带

StephenZhou 5590

<QT>抽象类实例化

抽象类不能通过new实例化,即使它所有的纯虚函数都在派生类中重写,也只能实例化子类(派生类)。 当实例化派生类时,抽象类也会跟随着实例化。

wangzhiqian7hao的专栏 2246

iStoreOS等软路由插件卸载的残留?分享一款软路由高级卸载工具,自定义卸载,轻松解决卸载残留问题

iStoreOS用户看过来!👀 还在被插件包残留困扰吗?本文分享一款“高级卸载”的插件,助你深度清理iStoreOS系统,彻底解决软件卸载不净的痛点,告别频繁恢复出厂设置的烦恼!🚀

XiaoqiangClub的博客 1541

Qt学习笔记03_几个抽象类的组件

QAbstractButton、QlineEdit AbstractSpinBox QAbstractSlider

兜ぃф糖 5287

【25届数字IC秋招总结】面试经验6——经纬恒润

25届数字ic面试记录——经纬恒润

lalala0635的博客 991

第2.0章 机器人C++学习开篇(一):SLAM为什么使用C++语言及学习路线资料推荐

ROS(机器人操作系统):机器人领域的“操作系统”,提供节点通信、参数管理、工具链支持,是SLAM算法在机器人上部署的核心框架。PCL(点云库):处理三维点云数据的利器,包含滤波、分割、配准等算法,是激光SLAM的核心依赖。Eigen(矩阵运算库):高效的矩阵与线性代数运算库,SLAM中的位姿变换、优化求解都依赖它。Ceres/G2O(优化库):SLAM后端优化的“王牌”,Ceres擅长通用非线性优化,G2O则专为图优化设计,二者是BA( bundle adjustment)等算法的实现基础。

行知SLAM 1242

C++多态中级复习

C++多态中级复习

C/C++ 941

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C++多态基础复习

C++多态基础

C/C++ 1012

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C++多态(复习)

重定义(隐藏)是指两个函数分别在基类和派生类的作用域,这两个函数的函数名相同。若两个基类和派生类的同名函数不构成重写就是重定义。

qq_73955920的博客 392

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C++复习之多态

前两天面试的时候,刚好多态没看到。。。。多年没有用过(其实也就两年。。。QAQ),全线崩盘,so,认认真真的开始了复习。 首先,多态解决的问题就是派生类和基类有同名函数的情况下,如果都用基类的指针来指向二者的对象,那么该函数都会执行基类的函数。 举个栗子: #include &lt;iostream&gt; using namespace std; class Ve...

KatharinLin的博客 308

C++ 多态 复习笔记

多态概念: 虚函数: 虚函数是一种在基类定义为virtual的函数,并在一个或多个派生类中再定义的函数。虚函数的特点是,只要定义一个基类的指针,就可以指向派生类的对象 虚函数重写---当在子类中定义了一个与父类相同的虚函数时,则称子类的这个函数重写了父类的这个虚函数 虚函数虚在“推迟联编”或者“动态联编”上,一个类函数的调用并不是在编译时刻被...

fistraiser的博客 310

【c++复习笔记】——多态详细解析,多态的原理,多态的笔试题

💂 个人主页:努力学习的少年 🤟 版权:本文由【努力学习的少年】原创、在优快云首发、需要转载请联系博主 💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 ​

sjp11的博客 6079

C++继承,多态复习

这里写目录标题一级目录 一级目录

loreal8的博客 194

关于C++多态的复习总结

关于C++多态的复习总结

m0_62126248的博客 1123

C++多态的复习

1.继承 访问控制和继承 派生类可以访问基类中所有的非私有成员。因此基类成员如果不想被派生类的成员函数访问,则应在基类中声明为 private。 我们可以根据访问权限总结出不同的访问类型,如下所示: 访问 public protected private 同一个类 yes yes yes 派生类 yes yes no 外部

rainlua的博客 251

c++关于多态的复习整理

c++关于多态的复习整理一、静态联编二、动态联编(多态)三、纯虚函数和虚析构 一、静态联编 1、将源代码中的函数调用解释为执行特定的函数代码被称为函数名联编 2、根据函数名选择对应的函数体执行,但是在C++有函数重载所以这必须还要看函数的参数及函数名才能确定使用那个函数 3、这种可以在编译过程就完成的这种编译(静态联编) #include<iostream> using namespace std; class Animal { public: void eat(); }; class Dog

qq_45930294的博客 411

C++复习_多态

父类纯虚函数实现、子类虚函数重写加需求、子类中堆区创建对象在重写中输出(创建string*即指针类型的子类成员变量、在子类构造函数中通过new在堆区创建name对象用子类创建的指针类型成员变量接收,最后在虚函数中解引用输出)、测试函数中创建父类指针指向new出的子类对象,并传入name、指针调用子类虚函数、手动delete子类对象。(2)当父类引用指向子类对象时,也即发生多态时,传入一个子类对象,调用虚函数,此时记录虚函数的地址已经发生替换,所以调用子类的虚函数,完成多态。

qq_45063488的博客 916

【C++复习】多态{深入理解多态底层}

介绍 windows下堆栈相对位置 析构函数 复习override和final和重载/重定义/重写 抽象类 多态原理 回顾虚基表指针 单继承多态底层 打印虚函数表 多继承多态底层 c++输出类成员函数地址 再次理解多态 早期绑定/晚期绑定

Ape's IT Blog 1072

【C++复习】:多态

摘要 多态是面向对象编程的核心概念,指同一接口在不同场景下的多种实现方式。主要分为静态多态(函数重载)和动态多态(虚函数机制)。动态多态需满足三要素:继承关系、虚函数重写和父类指针/引用调用。虚函数表是实现多态的关键机制,存储虚函数地址并支持运行时动态绑定。重要特性包括:析构函数建议设为虚函数防止内存泄漏、纯虚函数定义抽象类、override/final关键字的使用等。多态虽带来灵活性但也存在性能开销、调试复杂等缺点。理解多态原理对掌握C++面向对象编程至关重要。

2402_83910930的博客 734
上一篇: C++复习 -- 继承
下一篇: 一文带你入门信号与槽
mx_jun
博客等级 码龄5年 1605粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值