首页

文章

C++中虚函数的作用是什么?定义是什么?简要说明下,并举一个简单的例子?

发布网友 发布时间:2022-03-18 00:38

我来回答

3个回答

热心网友 时间:2022-03-18 02:07

作用:虚函数的作用就是将接口(函数调用)与实现(函数定义)分开, 就是实现所谓的多态行为。也就是说虚函数提供了让你修改基类函数定义的机会。这里虽然你定义了一个派生类但是这个派生类任然可以按照基类的方式使用,即将派生类对象传递给需要基类引用、指针的函数。

定义: 在一个类中,一个由virtual 关键字修饰的函数声明表示这个函数声明所对应的函数调用既要服务于本类中的函数定义也要服务于派生类中的函数定义,相当于一个接口的作用。

一段良好的代码通常只使用基类提供的接口来编写,那些与派生类相关的代码单独放在一个地方(工厂)。

例子:

        

        

class Window {
        public:
            virtual void drawEvent(void *event);   /
            virtual void keyEvent(void *event);
            virtual void mouseEvent(void *event);
            virtual void addWindow(Window *window);
            void show();
            virtual ~Window();   // 用到继承, 基类的析构函数必须声明为虚函数,否则是逻辑错误
            ...
        };
        
        class Button : public Window {
        public:
            // 以下声明表示重新定义基类的虚函数的函数体,改变基类相应函数的行为
            void drawEvent(void *event);
            void keyEvent(void *event);
            void mouseEvent(void *event);
            void setText(const std::string label);
            ....
        };
        
        class Menu;
        class MenuBar : public Window {
        public:
        // 以下声明表示重新定义基类的虚函数的函数体,改变基类相应函数的行为
            void drawEvent(void *event);
            void mouseEvent(void *event);
            void addWindow(Window *m);
            ...
        };
        
    class Menu : public Window {
    public:
    // 以下声明表示重新定义基类的虚函数的函数体,改变基类相应函数的行为
        void drawEvent(void *event);
        void mouseEvent(void *event);
        void keyEvent(void *event);
    };
    
    void userCode(Window &win, Window &win2) {
        win.addWindow(win2); //用户代码只用到了基类的引用
    }
    int main() {
        Window mainWindow(...);
        MenuBar menuar(...);
        Menu fileMenu(...);
        Button button(...);
        usrCode(mainWindow, menuBar); //将MenuBar对象当做Window引用来使用,由于定义了虚函数,所以usrCode会使用我们重定义的代码
        usrCode(menuBar, fileMenu);   //...
        usrCode(mainWindow, button);  //...
        mainWindow.show();
}

热心网友 时间:2022-03-18 03:25

虚函数的定义及作用:简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略
举例:class A
{
public:
void print(){ cout<<”This is A”<<endl;}
};

class B:public
{
public:
void print(){ cout<<”This is B”<<endl;}
};

int main() //为了在以后便于区分,我这段main()代码叫做main1
{
A a;
B b;

a.print();
b.print();
}

通过class A和class B的print()这个接口,可以看出这两个class因个体的差异而采用了不同的策略,输出的结果也是我们预料中的,分别是This is A和This is B。但这是否真正做到了
呢?No,多态还有个关键之处就是一切用指向
的指针或引用来操作对象。那现在就把main()处的代码改一改。

int main(){ //main2

A a;

B b;

A* p1=&a;

A* p2=&b;

p1->print();

p2->print();

}

运行一下看看结果,哟呵,
,结果却是两个This is A。问题来了,p2明明指向的是class B的对象但却是调用的class A的print()函数,这不是我们所期望的结果,那么解决这个问题就需要用到虚函数

class A{
public:
virtual void print(){ cout<<”This is A”<<endl;} //现在成了虚函数了

};

class B:public A
{
public:
void print(){ cout<<”This is B”<<endl;} //这里需要在前面加上关键字virtual吗?
};

毫无疑问,class A的成员函数print()已经成了虚函数,那么class B的print()成了虚函数了吗?回答是Yes,我们只需在把
的成员函数设为virtual,其
的相应的函数也会自动变为虚函数。所以,class B的print()也成了虚函数。那么对于在
的相应函数前是否需要用virtual关键字修饰,那就是你自己的问题了。

现在重新运行main2的代码,这样输出的结果就是This is A和This is B了。

现在来消化一下,我作个简单的总结,指向
的指针在操作它的多态类对象时,会根据不同的类对象,调用其相应的函数,这个函数就是虚函数。

热心网友 时间:2022-03-18 05:00

如楼上各位所说, 虚函数就是为了让代码的耦合度降低, 可以将接口和实现分离, 这个好处是很多的, 能够解决面向过程编程的很多问题, 基本上就是面向对象的核心,
历史要怎么读,有啥诀窍 高中历史诀窍 年终会活动策划方案 深度解析:第一财经回放,探索财经新风向 逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? 使用puppeteer实现将htmll转成pdf 内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档 【译】将HTML转为PDF的几种实现方案 变形金刚08动画怎么样 变形金刚08动画的问题 变形金刚08动画日语版剧情介绍 高分!换显卡nvidia控制面板被我卸了,重新安装显卡驱动后没了nvidia控... 我的nvidia控制面板被卸载了 怎么找回啊 卸载后 这个画面看着很奇怪_百 ... 李卓彬工作简历 林少明工作简历 广东工业职业技术学院怎么样 郑德涛任职简历 唐新桂个人简历 土地入股的定义 ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 绿萝扦插多久发芽 扦插绿萝多久发芽 炖牛排骨的做法和配料 网络诈骗定罪标准揭秘 “流水不争先”是什么意思? mc中钻石装备怎么做 为什么我的MC里的钻石块是这样的?我想要那种。是不是版本的问题?如果是... 带“偷儿”的诗句 “君不见巴丘古城如培塿”的出处是哪里 带“奈何”的诗句大全(229句) 里翁行()拼音版、注音及读音 带“不虑”的诗句 “鲁肃当年万人守”的出处是哪里 无尘防尘棚 进出口报关流程,越详细越好。谢谢大家指教。 双线桥不是看化合价升多少就标多少的吗?为什么CL2+2KI=2KCL+I2中I失... C++虚函数问题,续函数如何运行的机制 Objective-C有虚函数的概念吗? c++中什么是实函数 什么是虚函数 c++虚函数的说明 面向对象多态机制中,多个子类以不同的方式实现了父类里的虚函数,子类对象要调用父类中的虚函数时,父类 c/c++高手帮忙!!!c++中的virtual函数究竟是怎么实现的,用 C 语言表达出来,代码请加注释。 c加加多态的种类,各自实现的机制 虚函数的实现方式和C语言中的哪个数据类型相似 C语言问题虚函数的问题 C++中虚函数的作用是什么?它应该怎么用呢? c++中,虚函数的运行机制是什么 谁知道 C++ 中 虚函数的工作机制???? 求问,C++中纯虚函数的实现原理是什么,即C++通过什么样的机制来实现这个功能的?不是问它的作用是什么。 手机突然从4G变成E是什么意思? 4G网上的好好的,突然变成“E”是啥意思 Viⅴo27移动4g变成e怎么解决? 苹果4G变E了怎么切换回来? 为什么手机网络突然从4G变成一个E了 手机信号突然从4G变成“E”,这是啥意思? 4G变e怎么变回来 c++虚函数是干什么的?我没看懂,谁能给我讲一下 在C++中用虚函数的作用是什么?为什么要用到虚函数 c 虚函数的作用举例? 苹果7查询序列号出现无法验证产品购买日期是怎么回事啊 苹果序列号无法验证购买日期怎么办? 买的apple airpodspro官网查询序列号之后显示购买日期未验证是什么意思? 苹果序列号无法验证购买日期怎么办 官网查询序列号,提示让我验证购买日期是什么鬼 苹果序列号验证提示我们无法验证您产品的购买日期。是什么意思,这机器是翻新机吗 苹果耳机序列号显示购买日期未验证 苹果12序列号查询显示购买日期未验证? 苹果耳机序列号显示无法验证购买日期 新买的苹果8P,用了一天,查序列号显示,我们无法验证您产品的购买日期 苹果手机查询序列号提示需要验证购买日期,这是怎么回事? 新macbook查序列号显示“购买日期未验证”有没有问题? 苹果官网序列号查询需要提供购买时间但是显示无法完成请求是什么意思 苹果耳机我们无法验证您产品的购买日期 刚买的iPhone11为什么官网查询显示购买日期未验证? iphone12序列号显示购买日期未验证 pencil查序列号显示购买日期未验证
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com