多态的实现原理分析
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;
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;