虚函数相关内容

来源:互联网 发布:怎么淘宝介入 编辑:程序博客网 时间:2024/05/20 14:15

动态多态

名词 : 虚基类  虚继承(作用:菱形/多重继承)  纯虚函数  抽象类

#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

含有虚函数的基类的内存分布

原创粉丝点击