虚函数与多态需要注意的地方

来源:互联网 发布:海典软件招聘 编辑:程序博客网 时间:2024/06/05 17:05
1、派生类重写基类的虚函数实现多态,要求函数名、参数列表、返回值完全相同(协变除外)这里的协变在上一篇博客提到过
2、基类中定义了虚函数,在派生类中该函数始终保持虚函数的特性。
3、只有类的成员函数才能定义为虚函数。
4、静态成员函数不能定义为虚函数。
5、如果在类外定义虚函数,只能在声明函数时加virtual,类外定义函数时不能加virtual。
6、构造函数不能为虚函数,虽然可以将operator=定义为虚函数,但是最好不要将operator=定义为虚函数,因为容易使用时引起混淆。这里是合成办法,赋值父类还有赋值自己,
virtual Person& operator=(const Person& s)
{
   Person::operator=(s);调父类
}
virtual Student& operator=(const Student& s)
{
   Person::operator=(s);调父类
}
Person::fun()
{
    Student s;
    this->operator=(s);复制运算符的重载,构成多态,调用了子类
}
7、不要在构造函数和析构函数里面调用虚函数,对象不完整,会发生未定义的行为。因为虚函数可能调到子类,子类还没有初始化。
8、最好把基类的析构函数声明为虚函数。
因为父类指针有可能指向父类对象,有可能指向子类对象,如果函数不是多态,就调不到子类,就有内存泄漏的问题或者资源没有清理的问题。
class A
{
public:
A(int x = 10)
:_pa(new int(x))
{}
virtual ~A()
{
delete _pa;
cout << "~A()" << endl;
}
protected:
int* _pa;
};
class B :public A
{
public:
B()
:A(10)
, _pb(new int(20))}
~B()
{
delete _pb;//先析构子类,再析构父类
cout << "~B()" << endl;
}
protected:
int* _pb;
};
int main()
{
A *pa=new B;//先析构B,再析构A
delete pa;


pa=new A;//析构A
delete pa;


system("pause");
return 0;
}
输出:
~B()
~A()
~A()
原创粉丝点击