Effective C++ 条款09 绝不在构造和析构函数中调用虚函数

来源:互联网 发布:斯维尔是什么软件 编辑:程序博客网 时间:2024/05/16 15:01

请记住:

在构造和析构期间不要调用虚函数,因为这类调用从不下降至derived class。


代码如下:

#include<iostream>using namespace std;class Base{public:Base(){logbase();}virtual void logbase(){cout<<"This is Base's logbase"<<endl;}virtual ~Base(){}private:};class Derived:public Base{public:virtual void logbase(){cout<<"This is Derived's logbase"<<endl;}virtual ~Derived(){}};int main(){Derived d;system("pause");return 0;}


#include<iostream>using namespace std;class Base{public:Base(){init();}virtual void logbase(){cout<<"This is Base's logbase"<<endl;}virtual ~Base(){}private:void init(){logbase();}};class Derived:public Base{public:/*Derived(){logbase();}*/virtual void logbase(){cout<<"This is Derived's logbase"<<endl;}virtual ~Derived(){}};int main(){Derived d;system("pause");return 0;}

结果均为:



可是若当该虚函数会调用成员函数时


#include<iostream>using namespace std;class Base{public:Base():ma(1),mb(2){logbase(ma,mb);}virtual void logbase(int x,int y){cout<<"This is Base's logbase"<<endl;cout<<"x+y= "<<x+y<<endl;}virtual ~Base(){}private:int ma;int mb;};class Derived:public Base{public:virtual void logbase(int x,int y){cout<<"This is Derived's logbase"<<endl;cout<<"x*y= "<<x*y<<endl;}virtual ~Derived(){}private:int da;int db;};int main(){Derived d;system("pause");return 0;}

在build时会显示:

Linking...
LINK : fatal error LNK1168: cannot open Debug/vita.exe for writing
执行 link.exe 时出错.

0 0
原创粉丝点击