当前位置: 首页 > news >正文

C++构造函数虚函数例题

虚函数:

#include <iostream>

class A
{
public:
    A ():m_iVal(0)
    {
        test();
    }
    virtual void func()
    {
        std::cout<<m_iVal<<' ';
    }
    void test()
    {
        func();
    }
public:
    int m_iVal;
};


class B : public A
{
public:
    B()
    {
        test();
    };
    virtual void func()
    {
        ++m_iVal;
        std::cout<<m_iVal<<' ';
    }
};
int main(int argc ,char* argv[])
{
    A*p = new B;
    p->test();
    return 0;
}
 输出结果 0 1 2;
A*p = new B;
B的构造函数先要调用A的构造函数
A中m_iVal初始化为0,输出0
然后调用自己的构造函数
自己的构造函数有个test()函数,自然只能去调用父类中的函数test,但要注意这个test调用func确实B的

 此时的B中的A类子对象已经构造好了,所以这个func()函数将是B的,这里是B的并不是因为多态,而是因为在构造函数中调用虚函数就是这样
最后一个p->test();这个最简单多态的原因当然是调用B的



如果把A中的Virtual去掉

void func()
{
std::cout<<m_iVal<<' ';
}

则结果是 0 0 0;

这个是因为所有的都是调用A的func



3 代码在做修改
#include <iostream>

class A
{
public:
    A ():m_iVal(0)
    {
        test();
    }
    void func()
    {
        std::cout<<m_iVal<<' ';
    }
    void test()
    {
        func();
    }
public:
    int m_iVal;
};


class B : public A
{
public:
    B()
    {
        func();
    };
    virtual void func()
    {
        ++m_iVal;
        std::cout<<m_iVal<<' ';
    }
};
int main(int argc ,char* argv[])
{
    A*p = new B;
    p->func();
    return 0;
}

输出 0 1 1.

特别要注意 p->func();这个在C++中是不表现出多态的,C++中的多态需要父类为虚函数

4、输出 
bar foo b_bar

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;

struct A
{
    void foo(){printf(" foo");}
    virtual void bar(){printf(" bar");}
    A(){bar();}

};
struct B: A
{
    void foo(){printf(" b_foo");}
    void bar(){printf(" b_bar");}

};


int main()
{


    A* p=new B;
    p->foo();
    p->bar();
    return 0;

}

这个尤其能说明上面的问题, fool没有virtual 因而不表现多态,输出还是A的

5 再来看个构造和析构的问题

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
class A
{
public:
    A()
    {
        cout<<"construct A"<<endl;
    }
    ~A()
    {
        cout<<"destruct A"<<endl;
    }
};

class B:public A
{
public:
    B()
    {
        cout<<"construct B"<<endl;
    }
    ~B()
    {
        cout<<"destruct B"<<endl;
    }
};
int main()
{


    B* p=new B;
    delete(p);
    return 0;

}

construct A
construct B
destruct B
destruct A

 

而如果改成

A* p=new B;

construct A
construct B
destruct A



转载于:https://www.cnblogs.com/hixin/p/4784146.html

相关文章:

  • Servlet过滤字符串的HTML特殊字符
  • PHP中print_r、var_export、var_dump区别
  • Jsp/Servlet根据请求参数自动填充Java对象:表单Bean
  • ORACLE 如何定位消耗资源的SQL
  • Servlet/Jsp实现当参数确实或缺失重新显示输入表单
  • Servlet/Jsp实现发送压缩Web页面 Gzip技术
  • Java内存区域与内存溢出
  • 如何删除鼠标右键菜单里的打开按钮
  • Struts2的s:date标签使用详解[转]
  • JSP隐含对象(1)
  • 二级指针的思考
  • JSP隐含对象 request(2)
  • JSP实现网页计算器
  • MySQL汇总数据
  • 如何配置Tomcat的热启动
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • android 一些 utils
  • Elasticsearch 参考指南(升级前重新索引)
  • flutter的key在widget list的作用以及必要性
  • Java读取Properties文件的六种方法
  • Java方法详解
  • JSONP原理
  • MaxCompute访问TableStore(OTS) 数据
  • Sublime Text 2/3 绑定Eclipse快捷键
  • tab.js分享及浏览器兼容性问题汇总
  • 警报:线上事故之CountDownLatch的威力
  • 通信类
  • 用jquery写贪吃蛇
  • 用Python写一份独特的元宵节祝福
  • MyCAT水平分库
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 仓管云——企业云erp功能有哪些?
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 如何在招聘中考核.NET架构师
  • 整理一些计算机基础知识!
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​批处理文件中的errorlevel用法
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #{} 和 ${}区别
  • (1)(1.9) MSP (version 4.2)
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (C语言)逆序输出字符串
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (SpringBoot)第七章:SpringBoot日志文件
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (四) Graphivz 颜色选择
  • (译) 函数式 JS #1:简介
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .“空心村”成因分析及解决对策122344
  • .equals()到底是什么意思?
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划