摘自于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的虚函数表中【谁有虚函数表,谁就放在前面,此时和继承顺序无关】【谁有虚函数表, 谁就往前靠!】
若其两个父类均没有虚函数表,则会自己创建
需要说明的是,采用虚函数覆盖后,派生类与基类指针都可以实现多态。