《Effective C艹》读书笔记(6)

条款09:绝不在构造和析构过程中调用virtual函数

    首先看下面一段代码,我们将在基类的构造函数中调用虚函数

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
class base{
public:
    base(){
        fun();
    }
    virtual void fun(){
        cout<<"base class - fun\n";
    }
};

class dev: public base{
public:
    dev(){
        fun();
    }
    virtual void fun(){
        cout<<"dev class - fun\n";
    }
};
int main(){
    dev d;
    return 0;
}

编译之后这段程序的输出是:

base class - fun
dev class - fun

    也就是说,其在我们不知情的情况下,私自调用了基类的fun函数!所以为了保证程序的可靠性,在构造和析构期间不要调用virtual函数,因为这类调用从不下降至派生类

   

条款10:令operator=返回一个reference to *this

    之所以有这样的条款,是为了方便我们进行如下的操作

data a,b,c;
a = b = c;

     如果没有返回值,很明显上面的代码会报错。具体的写法如下

class base{
public:
    int data;
    base& operator=(const base& a){
        this->data = a.data;
        return *this;
    }
};

猜你喜欢

转载自bbezxcy.iteye.com/blog/2241466
今日推荐