虚函数只要在基类里定义,所以继承类都不用重新定义为虚函数,自动成为虚函数。
虚函数必须有实现,普通成员函数在没有调用时可以没有实现(定义)。
class animal
{
public:
animal(){cout<<"animal"<<endl;}
virtual ~animal(){cout<<"~animal"<<endl;}
public:
virtual void speak(){cout<<"no speak"<<endl;}
void smile();
};
只需要在基类定义函数为虚,子类中不需要添加virtual. smile函数在没有调用时可以不实现。
当有函数为虚函数时,析构函数应定义为virtual,负责不能正确调用析构函数。切记!!!!!
class cat:public animal
{
public:
cat(){cout<<"cat"<<endl;}
~cat(){cout<<"~cat"<<endl;}
public:
void speak(){cout<<"miaomiao"<<endl;}
};
class smallcat:public cat
{
public:
smallcat(){cout<<"smallcat"<<endl;}
~smallcat(){cout<<"~smallcat"<<endl;}
public:
void speak(){cout<<"small miaomiao"<<endl;}
};
///main.cpp
int main(int argc, char **argv)
{
animal *am = new smallcat();
delete am;
return 0;
}
以上输出为
animal
cat
smallcat
~smallcat
~cat
~animal
当析构函数不为虚函数时:
animal
cat
smallcat
~animal