派生类中重新定义虚函数及虚函数的注意事项

时间:2020-12-20 20:01:40

在派生类中重新定义虚函数时,不需加关键字virtual但是必须要和父类中的同名,同返回类型,同参数列表

例外

父类可以返回父类指针
派生类可以返回派生类指针

class base
{
public:
base* show()
{
cout<<"this is base show()!"<<endl;
return this;
}
};

class D : public base
{
public:
D* show()
{
cout<<"this is D show()!"<<endl;
return this;
}
};

void main()
{
D d;
base *p = &d;
p->show(); //调用base中的show方法
}

1.只有类的成员函数才能做虚函数
2.静态成员函数是所有同类对象所共有的,不能作为虚函数
3.全局函数不能做虚函数
4.内联函数不能做虚函数
5.构造函数不能定义为虚函数(因为在调用构造函数的时候对象还没有完全初始化)
6.析构函数可以定义为虚函数(在父类及其派生类中都动态分配内存空间时,必须把父类的析构函数定义为虚函数,实现撤销对象时的多态性)

class base
{
public:
base() //父类构造函数
{
cout<<"create base!"<<endl;
}
~base() //父类析构函数
{
cout<<"free base!"<<endl;
}
};

class D : public base
{
public:
D()
{
cout<<"create D!"<<endl;
}
~D()
{
cout<<"free D!"<<endl;
}
};

void main()
{
base *p = new D; //分配动态内存
delete p; //释放内存
}

执行结果:
未将父类的析构函数设成虚函数时:

create base!
create D!
free base!

将父类的析构函数设成虚函数时:

create base!
create D!
free D!
free base!