今天被同学问到“虚函数继承”,一时间怎么也想不起来函数怎么和继承挂上钩了。然后重新翻看了下C++课本,这里重新梳理下C++的各种有关于virtual的概念
1. virtual修饰类之间的继承关系(虚继承)--->解决多重继承中二义性的问题
例如:
class A { void f(){}; };
class B:public A{ }; -----> class B:virtual public A{ };
class C:public A{ }; -----> class C:virtual public A{ };
class D:public B, public C{ };
则在类D中存在两份A的成员拷贝,当调用D.f()时,无法确定是调用那份拷贝。此为二义性,为解决此问题,当继承关系中用virtual修饰时就可以了。 这时,基类A称为虚基类;
2.virtual修饰类中成员函数----->多态 (虚函数)
class A {
void f(){ cout<<"A"<<endl; } -----> virtual void f(){ cout<<"A"<<endl; }
};
class B:public A{
void f(){ cout<<"B"<<endl; } -----> virtual void f(){ cout<<"B"<<endl; }
};
class C:public A{
void f(){ cout<<"C"<<endl; } -----> virtual void f(){ cout<<"C"<<endl; }
};
void fun(A *pa)
{
pa->f();
}
main()
{
A *pa; B b; C c;
pa=&b;
fun(pa);
pa=&c;
fun(pa);
}
此时输入为AA,而当f()函数用virtual修饰时则可以得到想要的BC;
3. 纯虚函数 ---> 包含有纯虚函数的类为抽象数据类型,不可以实例化;
class A {
virtual void f()=0;
};