C++虚函数与抽象类
1.虚函数
I>虚函数声明:
在类内的函数声明前加virtual,类外定义时不用加
class A {
public:
A() {
}
virtual void f();
};
void A::f() {
cout << "A::f()" << endl;
}
class B : public A{
public:
B() {
}
void f();
};
void B::f(){
cout << "B::f()" << endl;
}
II>虚函数调用:
通过对象调用时,和普通函数一样
由于基类引用和指针可以指向派生类,通过基类引用和派生类调用虚方法时,可以判断当前对象的类型,调用对应的方法(Java中被成为动态绑定)
int main() {
A objA;
B objB;
A &ra_a = objA;
A &ra_b = objB;
objA.f();
objB.f();
ra_a.f();
ra_b.f();
return 0;
}
输出:
A::f()
B::f()
A::f()
B::f()
前两个通过对象调用,和普通的函数一样;后面两个都通过基类引用调用,根据对象类型不同调用不同的函数。
虚函数的调用机制通过虚函数表实现,我的另一篇博客有写到。
III>需要注意的地方:
将基类的析构函数声明为虚函数 这样基类的指针在delete对象时,调用的就是和对象类型相符的析构函数。
2.抽象类
I>纯虚函数
声明: virtual 函数头(参数列表) = 0;
II>抽象类
至少包含一个纯虚方法的类叫抽象类,抽象类不能实例化,但可以被继承
III>继承抽象类
可以通过继承抽象基类,在派生类中实现基类中的纯虚方法,使派生了可以实例化对象
虽然抽象类不能实例化,但可以通过抽象类的指针管理它的派生类对象