理解虚基类、虚函数与纯虚函数的概念(转载)
class?A
{
public:
????int?iValue;
};
class?B:public?A
{
public:
????void?bPrintf(){cout<<"This?is?class?B"<<endl;};
};
class?C:public?A
{
public:
????void?cPrintf(){cout<<"This?is?class?C"<<endl;};
};
class?D:public?B,public?C
{
public:
????void?dPrintf(){cout<<"This?is?class?D"<<endl;};
};
void?main()
{
????D?d;
????cout<<d.iValue<<endl;?//错误,不明确的访问
????cout<<d????cout<<d????cout<<d}
从代码中可以看出类B C都继承了类A的iValue成员,因此类B C都有一个成员变量iValue ,而类D又继承了B C,这样类D就有一个重名的成员 iValue(一个是从类B中继承过来的,一个是从类C中继承过来的)class?A
{
public:
????int?iValue;
};
class?B:virtual?public?A
{
public:
????void?bPrintf(){cout<<"This?is?class?B"<<endl;};
};
class?C:virtual?public?A
{
public:
????void?cPrintf(){cout<<"This?is?class?C"<<endl;};
};
class?D:public?B,public?C
{
public:
????void?dPrintf(){cout<<"This?is?class?D"<<endl;};
};
void?main()
{
????D?d;
????cout<<d.iValue<<endl;?//正确
}
在继承的类的前面加上virtual关键字表示被继承的类是一个虚基类,它的被继承成员在派生类中只保留一个实例class?A
{
public:
????void?funPrint(){cout<<"funPrint?of?class?A"<<endl;};
};
class?B:public?A
{
public:
????void?funPrint(){cout<<"funPrint?of?class?B"<<endl;};
};
void?main()
{
????A?*p;?//定义基类的指针
????A?a;
????B?b;
????p=&a;
????p->funPrint();
????p=&b;
????p->funPrint();
}
大家以为这段代码的输出结果是什么?有的人可能会马上回答funPrint of class A 与 funPrint of class B 因为第一次输出是引用类A的实 例啊,第二次输出是引用类B的实例啊class?A
{
public:
????virtual?void?funPrint(){cout<<"funPrint?of?class?A"<<endl;};
};
class?B:public?A
{
public:
????virtual?void?funPrint(){cout<<"funPrint?of?class?B"<<endl;};
};
void?main()
{
????A?*p;?//定义基类的指针
????A?a;
????B?b;
????p=&a;
????p->funPrint();
????p=&b;
????p->funPrint();
}
在基类的成员函数前加virtual关键字表示这个函数是一个虚函数,所谓虚函数就是在编译的时候不确定要调用哪个函数,而是动态决定将要调 用哪个函数,要实现虚函数必须派生类的函数名与基类相同,参数名参数类型等也要与基类相同class?Vehicle
{
public:
????virtual?void?PrintTyre()=0;?//纯虚函数是这样定义的
};
class?Camion:public?Vehicle
{
public:
????virtual?void?PrintTyre(){cout<<"Camion?tyre?four"<<endl;};
};
class?Bike:public?Vehicle
{
public:
????virtual?void?PrintTyre(){cout<<"Bike?tyre?two"<<endl;};
};
void?main()
{
????Camion?c;
????Bike?b;
????b.PrintTyre();
????c.PrintTyre();
}
如上代码,定义了一个交通工具类(Vehicle),类中有一函数可打印出交通工具的轮胎个数,但交通工具很多轮胎个数自然也就不确定,所以 就把它定义为纯虚函数,也就是光定义函数名不去实现它,类Camion继承了Vehicle并实现了里面的代码,打印出有4个轮胎。?
????3, 纯虚函数不能实化化,但可以声明指针。