动态多态
名词 : 虚基类 虚继承(作用:菱形/多重继承) 纯虚函数 抽象类
#if 0
//虚继承作用:菱形继承只构造一次class A
{
public:
A(int a):ma(a){cout<<"A()"<<endl;}
~A(){cout<<"~A()"<<endl;}
private:
int ma;
};
class B : virtual public A
{
public:
B(int a):A(a), mb(a){cout<<"B()"<<endl;}
~B(){cout<<"~B()"<<endl;}
private:
int mb;
};
class C : virtual public A
{
public:
C(int a):A(a), mc(a){cout<<"C()"<<endl;}
~C(){cout<<"~C()"<<endl;}
private:
int mc;
};
// 多重继承
class D : public B, public C
{
public:
D(int a): A(a), B(a), C(a), md(a){cout<<"D()"<<endl;}
~D(){cout<<"~D()"<<endl;}
private:
int md;
};
int main()
{
//B bb(20);
//C cc(10);
D d(10);
return 0;
}
#endif
#if 0
//虚基类 有虚函数的基类
class Base
{
public:
virtual void show(){cout<<"Base::show"<<endl;}
virtual ~Base(){cout<<"~Base"<<endl;}
private:
int ma;
};
class Derive: virtual public Base // 虚继承
{
public:
void show(){cout<<"Derive::show"<<endl;}
~Derive(){cout<<"~Derive";}
private:
int mb;
};
int main()
{
Base *p = new Derive();
p->show();//Derive::show
delete p;//将析构函数写为虚函数
return 0;
}
#endif
#if 0
//有纯虚函数的类叫做抽象类
//抽象类和普通类唯一的区别就是 抽象类不能定义对象
class Animal
{
public:
Animal(string name):_name(name){}
virtual void bark() = 0; //纯虚函数
protected:
string _name;
};
class Dog : public Animal
{
public:
Dog(string name):Animal(name){}
void bark()
{
cout<<_name<<" wang wang!"<<endl;
}
};
class Cat : public Animal
{
public:
Cat(string name):Animal(name){}
void bark()
{
cout<<_name<<" miao miao!"<<endl;
}
};
int main()
{
Animal *p1 = new Dog("dog");
Animal *p2 = new Cat("cat");
int *pp1 = (int*)p1;
int *pp2 = (int*)p2;
int temp = pp1[0];//交换vfptr,this指针不变.调用的函数变了
pp1[0] = pp2[0];
pp2[0] = temp;
p1->bark();//dog miao miao
p2->bark();//cat wang wang
delete p1;
delete p2;
return 0;
}
#endif
含有虚函数的基类的内存分布