虚函数:

#include <iostream>

class A
{
public:
A ():m_iVal()
{
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 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()
{
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 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 ; }

这个尤其能说明上面的问题, 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 ; }

construct A
construct B
destruct B
destruct A

而如果改成

A* p=new B;

construct A
construct B
destruct A

												

C++构造函数虚函数例题的更多相关文章

  1. C++构造函数中不能调用虚函数

    在构造函数中调用虚函数,并不会产生多态的效果,就跟普通函数一样. c++ primer 第四版中497页15.4.5构造函数和析构中的虚函数讲到,如果在构造函数或析构函数中调用虚函数,则运行的是为构造 ...

  2. c++虚函数和内联构造函数

    创建一个含有虚函数的对象时, 编译器会实现 "初始化其VPTR以指向相应的VTABLE" 这个操作 ,而实现这个操作是通过 "插入隐藏代码至构造函数中" 故此时 ...

  3. 关于在C#中构造函数中调用虚函数的问题

    在C#中如果存在类的继承关系,应避免在构造函数中调用虚函数.这是由于C#的运行机制造成的,原因如下: 新建一个类实例时,C#会先初始化该类(对类变量赋值,并将函数记在函数表中),然后再初始化父类.构造 ...

  4. C++ Daily 《3》----构造函数可否是虚函数

    C++ 中构造函数可否是虚函数? 绝不要!! 而且,在构造函数中调用虚函数也是不提倡的行为,因为会引发预想不到的结果. 因为,在 derived class 对象构造的过程中,首先调用的是基类的构造函 ...

  5. C++ 构造函数中调用虚函数

    我们知道:C++中的多态使得可以根据对象的真实类型(动态类型)调用不同的虚函数.这种调用都是对象已经构建完成的情况.那如果在构造函数中调用虚函数,会怎么样呢? 有这么一段代码: class A { p ...

  6. C++构造函数和析构函数调用虚函数时都不会使用动态联编

    先看一个例子: #include <iostream> using namespace std; class A{ public: A() { show(); } virtual void ...

  7. C++中为什么构造函数不能是虚函数,析构函数是虚函数

    一, 什么是虚函数? 简单地说,那些被virtual关键字修饰的成员函数,就是虚函数.虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离:用形象的语 ...

  8. C++:构造函数和析构函数能否为虚函数

    原文:http://blog.csdn.net/xhz1234/article/details/6510568 C++:构造函数和析构函数能否为虚函数? 简单回答是:构造函数不能为虚函数,而析构函数可 ...

  9. 构造函数为什么不能是虚函数 ( 转载自C/C++程序员之家)

    从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的.问题出来了,如果构造函数是虚的,就需要通过 vtable来调用, ...

随机推荐

  1. 使用EPPlus读写xlsx文件

    朋友有个需求,想对N张excel表做过滤和合并的处理,拜托我写个小程序.因为用户的背景是非专业用户,因此最好的选择是写个GUI程序,再加上读写excel的需求,所以我的首选就是C#的WinForm了. ...

  2. Poptest学员之当小厨师变成测试开发工程师

    没开玩笑,这是我们的真实案例.做培训以来,各行各业转行做测试的学员见得太多了.修车的.客服的.销售的.司机的.医护的.前台的等等.职位虽然不分贵贱,但是薪资却分多少.每个人心中都有让家人和自己过上好日 ...

  3. 性能测试分享:jmeter性能监控(一)

    性能测试分享:jmeter性能监控(一) poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908 ...

  4. 性能调优之MYSQL高并发优化下

    三.算法的优化 尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写..使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效 ...

  5. 玩转SSH(四):Struts + Spring + MyBatis

    一.创建 SSMDemo 项目 点击菜单,选择“File -> New Project” 创建新项目.选择使用 archetype 中的 maven-webapp 模版创建. 输入对应的项目坐标 ...

  6. js计算器

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  7. 不可不知的 Android strings.xml 那些事

    相信 strings.xml 已经是大家在 Android 开发中最熟悉的文件之一了,但其实它也有很多需要注意的地方和一些小技巧,知道了这些可以让你的 Android 应用更加规范易用,大家来看看吧. ...

  8. JavaWeb总结(一)—Servlet

    一.Servlet生命周期 1.Servlet生命周期 Serlet加载---->实例化---->服务---->销毁 2.init() Servlet容器启动时:读取web.xml配 ...

  9. 数字图像处理(MATLAB版)学习笔记(1)——第1章 绪言

    0.下定决心 当当入手数字图像处理一本,从此开此正式跨入数字图像处理大门.以前虽然多多少少接触过这些东西,也做过一些相关的事情,但感觉都不够系统,也不够专业,从今天开始,一步一步地学习下去,相信会有成 ...

  10. java中GUI的awt和Swing的知识点

    刚刚学习了java的GUI,写了几个程序,基本熟悉了awt和Swing,下面和大家分享一下知识点 1.JFrame的层次结构 参考:http://tieba.baidu.com/p/200421612 ...