多态的实现原理分析

多态的实现原理分析

1.成员函数加上virtual修饰后,sizeof(类)的数字变大,即使有多个成员函数声明成虚函数,sizeof(类)的数字不会再变大。

加了virtual后,用GDB调试的时候,发现对象b下多了个_vptr

#include <iostream>
using namespace std;

class Base{
public:
  Base() : x(0){

  }
  ~Base(){

  }
  virtual void show(){
    cout << "Base show" << endl;
  }
private:
  int x;
};

int main(){
  cout << sizeof(Base) << endl;//16
  Base b;
}

没加virtual的效果:

#include <iostream>
using namespace std;

class Base{
public:
  Base() : x(0){

  }
  ~Base(){

  }
  void show(){
    cout << "Base show" << endl;
  }
private:
  int x;
};

int main(){
  cout << sizeof(Base) << endl;//16
  Base b;
}

2.声明了虚拟函数后,系统会自动维护一个指针_vptr,指向虚函数列表。

多态是通过虚函数列表实现的。

#include <iostream>
using namespace std;

class Base{
public:
  Base() : x(0){

  }
  ~Base(){

  }
  virtual void show(){
    cout << "Base show" << endl;
  }
  virtual void print(){
    cout << "Base print" << endl;
  }
  void fun(){
    cout << "Base fun" << endl;
  }
  
private:
  int x;
};

class D : public Base{
public:
  D() : y(0){

  }
  ~D(){

  }
  void show(){
    cout << "D show" << endl;
  }
  void fun(){
    cout << "D fun" << endl;
  }
  virtual void list(){
    cout << "D list" << endl;
  }
private:
  int y;
};
int main(){
  D d;
  d.fun();//调用子类的fun方法,父类的fun方法被隐藏了

  Base *pb = &d;
  pb->show();//调用子类的show方法,多态(覆盖)
  pb->fun();//调用父类的fun方法

  Base &fb = d;
  fb.show();//用子类的show方法,多态(覆盖)
  fb.fun();//调用父类的fun方法
}

猜你喜欢

转载自www.cnblogs.com/xiaoshiwang/p/9140384.html