虚函数表问题

摘自于https://blog.twofei.com/496/
#include<iostream>
using namespace std;
class A
{
public:
	int base1_1;
	int base1_2;

	virtual void base1_fun1() {
		cout << "A" << endl;
	}
	virtual void base1_fun2() {
		cout << "A" << endl;
	}
private:
	int a;
};

class B: public A
{
public:
	void base1_fun1(){
		cout <<"B" << endl;
	}
	int derive1_1;
	int derive1_2;
};
class Base1
{
public:
	int base1_1;
	int base1_2;

	virtual void base1_fun1() {}
	virtual void base1_fun2() {}
};

class Base2
{
public:
	int base2_1;
	int base2_2;

	virtual void base2_fun1() {}
	virtual void base2_fun2() {}
};

// 多继承
class Derive1 : public Base1, public Base2
{
public:
	int derive1_1;
	int derive1_2;

	// 基类虚函数覆盖
	virtual void base1_fun1() {}
	virtual void base2_fun2() {}

	// 自身定义的虚函数
	virtual void derive1_fun1() {}
	virtual void derive1_fun2() {}
};
class son : public Derive1{

public:
	virtual void derive1_fun1() {}
};
int main(int, char**){

	cout << "********" << endl;
	A c;
	c.base1_fun1();
	cout << "********" << endl;
	B d;
	d.base1_fun1();
	
	cout << "********" << endl;
	A* a = new B();
	a->base1_fun1();
	delete a;
	cout << "********" << endl;
	B *b = new B();
	b->base1_fun1();
	delete b;
	cout << "********" << endl;
	Derive1 e;
	return 0;
}
子函数Derivel的内存分布如图所示:其自身定义的虚函数存在于Base1中的虚函数表中
 
 
【通过Derive1的指针还是Base1的指针来调用此方法, 调用的都将是被继承类重写后的那个方法(函数)
 
 
 
 
若Base1中没有虚函数表,则Derivel中自身的定义的虚函数存于Base2的虚函数表中【谁有虚函数表,谁就放在前面,此时和继承顺序无关】【谁有虚函数表, 谁就往前靠!】
 
 
若其两个父类均没有虚函数表,则会自己创建
 
 
 
 
需要说明的是,采用虚函数覆盖后,派生类与基类指针都可以实现多态。

猜你喜欢

转载自blog.csdn.net/qq_31339017/article/details/78119789
今日推荐