zoukankan      html  css  js  c++  java
  • C++中虚函数和动态绑定<下>

    静态绑定:编译时绑定,通过对象调用

    动态绑定:运行时绑定,根据地址确定

    如下:C++类成员函数调用和绑定方式

        

        图片来自于:http://wenku.baidu.com/view/4f97390016fc700abb68fcb5.html

    还有虚析构函数和虚函数表及其指针,由于时间和天气问题,明日继续。2012-02-26 00:53:08

    前面说了动态绑定是根据地址来调用相应的函数,在C++中每个有虚函数的类中都有一个虚函数表,保存着该类中虚函数的地址,

    而根据地址调用相应函数,正是通过将指向该虚函数表的指针赋值给了基类的指针,想了解更多关于虚函数表的只是,看以看看这位

    大神写的,很详细:http://blog.csdn.net/haoel/article/details/1948051#

    虚析构函数

    看一个例子,说一下为什么类中定义了虚成员函数,析构函数也应定义为虚析构函数。

    class TimeKeeper{

    public:

      TimeKeeper();

      ~TimeKeeper();

      ...

    };

    class AtomicClock: public TimeKeeper{...};//原子钟

    上面一个基类,一个派生类,如果我们进行下面的调用,

    TimerKeeper *ptk = new AtomicClock;

    ...

    ...

    delete ptk;

    这样进行一系列操作后,delete掉动态分配的对象,会有什么问题了?

    这样操作,delete实际上只调用了基类,也就是TimeKeeper的析构函数,而未调用派生类的析构函数,

    这将导致派生类中得成分未销毁,称为“局部销毁”现象。解决这个问题的做法很简单,给base class定义

    一个virtual析构函数,此后删除派生类对象时就会如你想的那样,销毁整个对象,包括派生类部分。

     author:good90

    参考:《effective C++》

        http://blog.csdn.net/haoel/article/details/1948051#

  • 相关阅读:
    Codeforces Round #239(Div. 2) 做后扯淡玩
    hdu 3507 Print Article
    prufer序列
    POJ 2778 DNA Sequence
    Codeforces Round #237 (Div. 2)
    poj3352
    图论知识
    POJ 2186
    Codeforces Round #236 (Div. 2)
    POJ 2823 Sliding Window
  • 原文地址:https://www.cnblogs.com/good90/p/2368305.html
Copyright © 2011-2022 走看看