C++语言笔记系列之十九——虚函数(2)

原创 2014年07月06日 11:31:38
1.构造函数和析构函数中调用虚函数
(1)采用静态编译。
(2)在编译阶段自动联接自己类中的函数或基类中的函数,不在派生类中重定义一个函数。
注:构造函数和析构函数中调用的虚函数,派生类都不一定存在的情况下,只能去调用基类或者自身的函数。
example 1

#include <iostream.h>

class A
{
public:
    A() {}
    virtual void func() {cout<<"A construction."<<endl;}
    ~A() {}
    virtual void fund() {cout<<"Destruction A."<<endl;}
};
class B:public A
{
public:
    B() {func();}
    void fun() {func();}
    ~B() {fund();}
};
class C:public B
{
public:
    C() {}
    void func() {cout<<"C construction."<<endl;}
    ~C() {fund();}
    void fund() {cout<<"C destruction."<<endl;}
};
int main()
{
    C c;
    c.func();
}
程序输出:
A construction.
C construction.
C destruction.
Destruction A.
2.空虚函数
    纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。
(1)表示:
virtual void 函数名() {} //空虚函数
virtual void 函数名()=0; //纯空虚函数
(2)目的:保证类在继承路线上接口唯一。
含义:若派生类想存取虚函数时,必须建立一条从基类到派生类的虚函数路径,许多中间类也必须描述该虚函数以保证其后的派生类可以使用虚函数。
注:类中含有纯虚函数该类就叫做抽象类,不能定义对象。
(3)空虚函数:无函数体,但具有函数形式,空虚函数是可以被调用的。
(4)纯虚函数:
A.没有函数实现过程的虚函数。
B.纯虚函数不可被调用,将纯虚函数的实现留给派生类以实现动态联编完成继承中的多态。
example 2

#include <iostream.h>

class Point
{
    int x, y;
public:
    Point(int i = 0, int j = 0) {x = i; y = j;}
    virtual void set()=0;
    virtual void draw()=0;
};
class Line:public Point
{
    int x1, y1;
public:
    Line(int i = 0, int j = 0, int m = 0, int n = 0):Point(i, j)
    {x1 = m; y1 = n;}
    void set() {cout<<"Line::set() called."<<endl;}
    void draw() {cout<<"Line::draw() called."<<endl;}
};
class Elipes:public Point
{
    int x2, y2;
public:
    Elipes(int i = 0, int j = 0, int p = 0, int q = 0):Point(i, j)
    {x2 = p; y2 = q;}
    void set() {cout<<"Elipes::set() called."<<endl;}
    void draw() {cout<<"Elipes::draw() called."<<endl;}
};
void drawobj(Point *p)
{p->draw();}
void setobj(Point *p)
{p->set();}
int main()
{
    Line *lineobj = new Line;
    Elipes *elipesobj = new Elipes;
    drawobj(lineobj);
    drawobj(elipesobj);
    setobj(lineobj);
    setobj(elipesobj);
}
程序输出:
Line::draw() called.
Elipes::draw() called.
Line::set() called.
Elipes::set() called.
注:基类Point不是虚基类,系统将会为派生类Line和Elipes分别建立基类副本,在派生类Line、Elipes的构造函数中,都要完整表示对基类构造函数的调用以及参数描述。代码中存在的问题,缺两个delete来释放内存。
3.在基类中定义纯虚函数,不实现其函数功能。
意义:
(1)将基类中set和draw函数的实现放在不同的派生类中去独立实现。
(2)由于纯虚函数是虚函数,只要使基类指针指向派生类对象就可以实现动态联编,就可以调用不同派生类中独立实现的每一个set和draw函数。
4.抽象类
(1)抽象类是一个特殊的类,即含有纯虚函数。
(2)位于继承中的上层——为派生类提供一个统一的界面。
作用:将相关派生类组织在一个继承层次结构中,为子类提供一个公共的根——保证相关子类从同一个根派生而来。
注意:
(1)抽象类只做基类。
(2)不能够创建抽象类的对象。
(3)抽象类的构造函数声明为受保护权限。
(4)不可将抽象类作为函数参数以及函数返回值类型。
(5)可以设置指向抽象类对象的指针,但该指针只可用于指向派生类对象,引用也是如此。
(6)将抽象类中的纯虚函数交给派生类来实现,派生类中也可以不实现,交给派生类的下一级派生类来实现,但是在派生类中必须定义自己的纯虚函数版本。

HDU 不容易系列之(4)——考新郎(组合错排)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=2049 思想基础:全部元素错排参见http://blog.csdn.net/liuweiyuxiang/a...
  • liuweiyuxiang
  • liuweiyuxiang
  • 2016年04月03日 23:43
  • 670

2045不容易系列之(3)—— LELE的RPG难题(递推)

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submissio...
  • qq_34594236
  • qq_34594236
  • 2016年06月29日 09:12
  • 248

纯C语言简单模拟C++的虚函数表

多态,面向接口编程等设计方法并没有绑定到任何特定的语言上,使用纯C也可以实现简单的多态概念。下面给出一个非常简单粗糙的例子,只为说明概念。 父类Animal定义 文件:animal.h#ifndef...
  • smstong
  • smstong
  • 2016年02月15日 18:14
  • 2471

2015-8-19 学习笔记

学习笔记           ibtias 学习 关于Android 网络通讯:   Http:request Receiver    SQL Map 的概念 SQL Map   API 可以轻易地...
  • wangming520liwei
  • wangming520liwei
  • 2015年08月19日 23:58
  • 272

【备忘】李兴华系列之Java8、Oracle、JavaScript、HTML5、Spring、Struts、Hibernate系列视频教程

李兴华系列之Java8、Oracle、JavaScript、HTML5、Spring、Struts、Hibernate系列视频教程...
  • qq_38472451
  • qq_38472451
  • 2018年01月07日 16:19
  • 112

【C/C++语法】C++ 虚函数表解析

文章源自:http://blog.csdn.net/haoel/article/details/1948051 (陈皓专栏) 与 http://blog.csdn.net/hairetz/artic...
  • woxiaohahaa
  • woxiaohahaa
  • 2016年03月17日 15:39
  • 652

简单的程序诠释C++ STL算法系列之十九:replace

替换算法将指定元素值替换为新值,使用原型如下,将迭代器[first,last)中值为old_value的元素全部替换为new_value值。     函数原型: template void ...
  • jerryjbiao
  • jerryjbiao
  • 2012年04月29日 22:14
  • 5036

HDOJ 不容易系列之(3)—— LELE的RPG难题

问题及代码: /*不容易系列之(3)—— LELE的RPG难题 Problem Description 人称“AC女之杀手”的超级偶像LELE最近忽然玩起了深沉,这可急坏了众多“Cole”(LELE...
  • linan_141
  • linan_141
  • 2015年06月07日 10:16
  • 699

Freescale 9S12 系列单片机应用笔记(SCI)2

这里给个利用串口收发中断的实现.   首先是头文件: /* sci_buffered.h */ #ifndef _SCI_BUFFERED_H_ #define _SCI_BUFFERED_...
  • liyuanbhu
  • liyuanbhu
  • 2012年07月20日 21:10
  • 2317

[Contiki系列论文之2]WSN的自适应通信架构

说明:本系列文章翻译自Contiki之父Adam Dunkels经典论文,版权归原作者所有。 Contiki是由Adam Dunkels及其团队开发的系统,研读其论文是对深入理解Contiki系...
  • tidyjiang
  • tidyjiang
  • 2016年04月07日 10:58
  • 1444
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++语言笔记系列之十九——虚函数(2)
举报原因:
原因补充:

(最多只允许输入30个字)