C++子类调用父类虚函数

众所周知,子类虚函数指针会把父类虚函数指针覆盖,如果要子类调用父类虚函数,方法如下

 1 class Father
 2 {
 3     virtual void show(){cout<<"this is father."<<endl;}
 4 };
 5 
 6 class Son
 7 {
 8    virtual void show(){cout<<"this is son."<<endl;} 
 9 };
10 
11 int main()
12 {
13     Father* f = new Son;
14     f->show();    //  输出“this is son.”
15     f->Father::show();    //  输出“this is father.”
16     return 0;
17 }

 

扩展:如果继承方式是A>B>C>D(A基类往下衍生),B* b = new D   能访问到的到哪一步的虚函数?

 1 class A
 2 {
 3 public:
 4     A() { cout << "constructor A." << endl; }
 5     virtual void show() { cout << "this is A." << endl; }
 6     virtual ~A() { cout << "destructor A." << endl; }     //  这里必须加virtual 不然子类不会调用析构函数
 7 };
 8 
 9 class B : public A
10 {
11 public:
12     B() { cout << "constructor B." << endl; }
13     virtual void show() { cout << "this is B." << endl; }
14     ~B() { cout << "destructor B." << endl; }
15 };
16 
17 class C : public B
18 {
19 public:
20     C() { cout << "constructor C." << endl; }
21     virtual void show() { cout << "this is C." << endl; }
22     ~C() { cout << "destructor C." << endl; }
23 };
24 
25 class D : public C
26 {
27 public:
28     D() { cout << "constructor D." << endl; }
29     virtual void show() { cout << "this is D." << endl; }
30     ~D() { cout << "destructor D." << endl; }
31 };
32 
33 int main()
34 {
35     B* b = new D;
36     b->show();
37     b->A::show();
38     b->B::show();
39         //  b->C::show();  // 报错,限定名不是类"B"或其基类
40     C* c = static_cast<C*>(b);  //  转换为类C
41     c->show();
42     c->C::show();  //  输出"this is C."
43     delete c;
44     return 0;
45 }

 结果很明显,B* b = new D 能访问到A、B、D的show()虚函数,若要访问到C,转换为类C后再访问即可。如下图所示,因为new D的时候,分配了ABCD总共4个类的空间(好浪费内存),既然开辟了,那么类C虚函数肯定是存在的。

 顺便再强调一下,若父类析构函数没有加virtual关键字,以非子类声明指针,子类不会调用析构函数,结果如下

 如果没有转换成类C,那么B* b = new D,在delete b时,只会调用A和B的析构函数,无形中产生内存泄漏。

 

posted @ 2021-12-27 22:41  补码  阅读(3537)  评论(0编辑  收藏  举报