两个类,一个base,一个derive。并且两个类中都实现了虚函数fun1和非虚函数fun2,代码如下:
class CBaseClass
{
public:
CBaseClass(){}
virtual ~CBaseClass(){}
virtual void fun1(){std::cout<<"CBaseClass virtual-fun is running!"<<std::endl;};
void fun2(){std::cout<<"CBaseClass non-virtual-fun is running!"<<std::endl;};
};
class CDeriveClass : public CBaseClass
{
public:
CDeriveClass(){};
virtual ~CDeriveClass(){};
virtual void fun1(){std::cout<<"CDeriveClass virtual-fun is running!"<<std::endl;};
void fun2(){std::cout<<"CDeriveClass non-virtual-fun is running!"<<std::endl;};
};
通过main函数调用来验证调用的是哪个类的函数
int main(int argc, char* argv[])
{
CBaseClass base;
base.fun1();
base.fun2();
std::cout<<std::endl<<"----------------------------"<<std::endl;
CDeriveClass derive;
derive.fun1();
derive.fun2();
std::cout<<std::endl<<"----------------------------"<<std::endl;
CBaseClass *pbase = new CDeriveClass;
pbase->fun1();
pbase->fun2();
std::cout<<std::endl<<"----------------------------"<<std::endl;
int tmp;
std::cin>>tmp;
return 0;
}
输出结果:
重点关注:
CBaseClass *pbase = new CDeriveClass;时,调用非虚函数时候,
变量作用域问题,当查找CBaseClass *pbase的函数时,首先从基类查找,若找到是虚函数,则查找子类,若不是虚函数,则不查找子类。
其他问题:
1.本例中类定义方式(实现和声明放在一起)属于隐式inline函数。
2.基类中的析构函数要定义成虚函数。
以上属于最近读 《Effective C++》关于这方面的收获!