C++学习笔记(18)——虚函数与构造函数、析构函数(2)
2008-03-20 00:01
357 查看
本博客(http://blog.csdn.net/livelylittlefish)贴出作者(三二一、小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正!
新定义,再运行,观察结果。
代码如下:
/**//************************************************************************
* 虚函数与构造函数、析构函数
************************************************************************/
#include <IOSTREAM.H>
class CBase
...{
public:
CBase() ...{cout<<"CBase Constructor! "; }
virtual void func() ...{cout<<"CBase::func() called! "; }
};
class CDerive: public CBase
...{
public:
CDerive()
...{
cout<<"CDerive Constructor! ";
func(); //调用虚函数
}
void func() ...{cout<<"CDerive::func() called! ";}
void func1() ...{func(); //调用虚函数 }
};
class CSubDerive: public CDerive
...{
public:
CSubDerive() ...{cout<<"CSubDerive Constructor! "; }
void func() ...{cout<<"CSubDerive::func() called! ";}
};
void main()
...{
CSubDerive obj; //will produce "CBase::func() called!"
obj.func1(); //will produce "CSubDerive::func() called!"
}
运行结果如下:
代码如下:
#include <IOSTREAM.H>
//基类
class CBase
...{
public:
CBase()
...{
cout<<"CBase Constructor! ";
func();
}
~CBase()
...{
cout<<"CBase deconstructor! ";
func();
}
virtual void func() ...{cout<<"CBase::func() called! "; }
};
//派生类
class CDerive: public CBase
...{
public:
CDerive()
...{
cout<<"CDerive Constructor! ";
func();
}
~CDerive()
...{
cout<<"CDerive deconstructor! ";
func();
}
void func()...{cout<<"CDerive::func() called! ";}
void func1()...{ func(); //调用虚函数 }
};
//子派生类
class CSubDerive: public CDerive
...{
public:
CSubDerive()
...{
cout<<"CSubDerive Constructor! ";
func();
}
~CSubDerive()
...{
cout<<"CSubDerive deconstructor! ";
func();
}
void func()...{cout<<"CSubDerive::func() called! ";}
};
void main()
...{
CSubDerive obj; //will produce "CBase::func() called!"
obj.func1(); //will produce "CSubDerive::func() called!"
}
运行结果如下:
由上图可知,在构造函数和析构函数内部的虚函数机制是不起作用的,也就是说,调用的是“局部”版本,即该类中的虚函数版本被调用。
虚函数与构造函数、析构函数(2)
对“C++学习笔记(17)——虚函数与构造函数、析构函数”例子中的CDerive类中的虚函数func()重新定义,再运行,观察结果。
代码如下:
/**//************************************************************************
* 虚函数与构造函数、析构函数
************************************************************************/
#include <IOSTREAM.H>
class CBase
...{
public:
CBase() ...{cout<<"CBase Constructor! "; }
virtual void func() ...{cout<<"CBase::func() called! "; }
};
class CDerive: public CBase
...{
public:
CDerive()
...{
cout<<"CDerive Constructor! ";
func(); //调用虚函数
}
void func() ...{cout<<"CDerive::func() called! ";}
void func1() ...{func(); //调用虚函数 }
};
class CSubDerive: public CDerive
...{
public:
CSubDerive() ...{cout<<"CSubDerive Constructor! "; }
void func() ...{cout<<"CSubDerive::func() called! ";}
};
void main()
...{
CSubDerive obj; //will produce "CBase::func() called!"
obj.func1(); //will produce "CSubDerive::func() called!"
}
运行结果如下:
在构造函数中加入虚函数
在例7的基础上,在每个类的构造函数中加入对虚函数的调用,并为每个类加上析构函数,且在析构函数中也加入对虚函数的调用,观察在构造函数和析构函数内部有虚函数时的工作情况。代码如下:
#include <IOSTREAM.H>
//基类
class CBase
...{
public:
CBase()
...{
cout<<"CBase Constructor! ";
func();
}
~CBase()
...{
cout<<"CBase deconstructor! ";
func();
}
virtual void func() ...{cout<<"CBase::func() called! "; }
};
//派生类
class CDerive: public CBase
...{
public:
CDerive()
...{
cout<<"CDerive Constructor! ";
func();
}
~CDerive()
...{
cout<<"CDerive deconstructor! ";
func();
}
void func()...{cout<<"CDerive::func() called! ";}
void func1()...{ func(); //调用虚函数 }
};
//子派生类
class CSubDerive: public CDerive
...{
public:
CSubDerive()
...{
cout<<"CSubDerive Constructor! ";
func();
}
~CSubDerive()
...{
cout<<"CSubDerive deconstructor! ";
func();
}
void func()...{cout<<"CSubDerive::func() called! ";}
};
void main()
...{
CSubDerive obj; //will produce "CBase::func() called!"
obj.func1(); //will produce "CSubDerive::func() called!"
}
运行结果如下:
由上图可知,在构造函数和析构函数内部的虚函数机制是不起作用的,也就是说,调用的是“局部”版本,即该类中的虚函数版本被调用。
相关文章推荐
- C++学习笔记(17)——虚函数与构造函数、析构函数
- 构造函数和析构函数能否声明为虚函数?
- 考察继承、虚函数、sizeof、构造函数析构函数的一道面试题
- 为什么C++的构造函数不可以是虚函数,而析构函数可以是虚函数
- 构造函数和析构函数能否声明为虚函数?
- [转载]构造函数、析构函数可否声明为虚函数
- 继承下构造函数与析构函数顺序及虚函数
- 构造函数 析构函数 的继承与虚拟问题 & 虚函数 纯虚函数
- 构造函数不能是虚函数 基类析构函数必须为虚函数
- 全局变量,继承,虚函数,构造函数和析构函数的调用过程
- 为什么构造函数不能声明为虚函数,析构函数可以
- c++使用技巧: 不要在构造函数/析构函数中调用虚函数
- 构造函数、析构函数调用虚函数
- 构造函数,析构函数可不可以是虚函数?
- 【C++】构造函数 析构函数 虚函数
- 构造函数,析构函数,虚函数等易错混淆点
- 虚函数与构造函数、析构函数
- 构造函数和析构函数,在C++中能否声明为虚函数?构造函数和析构函数里面能否调用虚函数?
- 为什么构造函数不能为虚函数,而析构函数可以为虚函数
- 为什么构造函数不能声明为虚函数,析构函数可以