C++:为什么在继承关系中,⽗类的析构函数最好定义为虚函数?
我们先来看⼀段简单代码,A类有⼀个指针成员_pa,B类公有继承了A类,然后⾃⼰有⼀个指针成员_pb:
如果不把⽗类的析构函数定义为虚函数,会有什么问题?
pa是A类的指针,它指向了新创建的B类对象,在析构时,理应调⽤B类的析构函数,然后执⾏结果是调⽤了A类的析构函数:
原因就是,没有构成多态,与类型有关,因为pa是⽗类的指针,就⼀定调⽤的是⽗类的析构函数。
但如果把A类的析构函数定义为虚函数:
问题是,⽗⼦的析构函数名字不相同,就算我加了virtual使⽗类的析构函数变为虚函数,也不会被⼦类重写啊。
其实,析构函数是⼀个特殊的函数,编译器在编译时,析构函数的名字统⼀为destucter,所以只要⽗类的析构函数定义为虚函数,不管⼦类的析构函数前是否加virtual(可以理解为编译器优化),都构成重写。
再看刚才的问题:class A{public :    A (int  x = 1)        :_pa(new  int (x))    {}    ~A()    {        cout << "~A()" << endl;    }protected :    int * _pa;};class B : public  A{public :    B (int  b)        :A (b)        ,_pb (new  int (b))    {}    ~B()    {        cout << "~B()" << endl;    }protected :    int * _pb;};
1
2
3
4
5
析构函数的定义
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29void  Test(){    A* pa = new  B(0);//⽗类的指针指向了⼦类的对象    delete  pa;//}
1
2
3
4
<    virtual ~A()    {        cout << "~A()" << endl;    }......
1
2
3
4
5
6
⽗类的指针指向了⼦类的对象,然后调⽤重写虚函数——析构函数,不就构成了多态嘛,⽽多态与类型⽆关,只与对象有关,所以调⽤的就是⼦类的析构函数了。void  Test(){    A* pa = new  B(0);//⽗类的指针指向了⼦类的对象    delete  pa;//}
1
2
3
4
5

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。