虚函数:

#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. Java并发编程:线程控制

    在上一篇文章中(Java并发编程:线程的基本状态)我们介绍了线程状态的 5 种基本状态以及线程的声明周期.这篇文章将深入讲解Java如何对线程进行状态控制,比如:如何将一个线程从一个状态转到另一个状态 ...

  2. 实用开发之-oracle表回滚到一个指定时间的操作语句

    在开发或客户使用过程中,难免会出现误操作或脏数据,那么怎么迅速处理这个问题呢? 1.备份还原就用了,太麻烦. 就是使用ORACLE的备份功能,然后在还原,还原的时候新建一个库,然后使用dblink进行 ...

  3. JVM年轻代、年老代、永久代

    年轻代: HotSpot JVM把年轻代分为了三部分:1个Eden区和2个Survivor区(分别叫From和To),每次新创建对象时,都会分配到Eden区,当Eden区没有足够的空间进行分配时,虚拟 ...

  4. ABCD多选正则表达式

    正则表达式: 4个选项,可单选可多选不允许重复 ABCD正则: regexp : /^(?!.*((A.*){2,}|(B.*){2,}|(C.*){2,}|(D.*){2,})$)[A-D]{1,4 ...

  5. lua 运算符

    lua 运算符 算术运算符 操作符 描述 + 加 - 减 * 乘 / 除 % 求模 ^ 求幂 示例程序 local a, b = 1, 2 print(a + b) print(a - b) prin ...

  6. java源码剖析: 对象内存布局、JVM锁以及优化

    一.目录 1.启蒙知识预热:CAS原理+JVM对象头内存存储结构 2.JVM中锁优化:锁粗化.锁消除.偏向锁.轻量级锁.自旋锁. 3.总结:偏向锁.轻量级锁,重量级锁的优缺点. 二.启蒙知识预热 开启 ...

  7. Linux-配置vim开发环境

    vim是一个类似于vi的著名的功能强大.高度可定制的文本编辑器,在vi的基础上改进和增加了很多特性.vim是纯粹的自由软件. 为了满足使用者的要求,将vim界面配置为自己想要的界面类型也变得流行起来. ...

  8. C语言学习第九章

    学习C语言的最后一节课了,原因嘛上一章的末尾说过了,其实写这篇博客的时候以后开始学习Java一个多月了,一直因为各种各样的原因没有坚持做到每天一篇学习记录,可能主要因为懒吧....也有点笨,Java的 ...

  9. 为linux系统实现回收站

    在linux系统中,经常采用"rm *"或"rm -r *"操作删除一下文件,但是有时某些文件并不是我们想要删除的,但是已经被删除.很多时候都是悲剧的,数据是难 ...

  10. myeclipse离线安装PyDev

    MyEclipse装好了,用来开发java web的,一直可以用,前几天用python写爬虫,也是在myeclipse下,离线安装的包.打开后配置了一下就可以了. 这里用的是PyDev2.8.2    ...