1. C++关键字:virtual用法
1.1 概念
virtual是C++ OO机制中很重要的一个关键字。主要用在两个方面:虚函数、纯虚函数和虚基类、虚继承。
1.2 虚函数
virtual放在函数的返回值前面,用于表示该类成员函数为虚函数;父类虚函数前的virtual必须写;子类虚函数前的virtual可以省略,因为不管省不省略,该函数在子类中也是虚函数类型;virtual只能出现在类内部的函数声明语句之前而不能用于类外部的函数定义。
如下程序,在类Base中加了virtual关键字的函数就是虚拟函数(函数foo),于是在Base的派生类Derived中就可以通过重写虚拟函数来实现对基类虚拟函数的覆盖。当基类Base的指针p指向派生类Derived的对象时,对p的foo函数的调用实际上是调用了Derived的foo函数而不是Base的foo函数。这是面向对象中的多态性的体现。如下例程序,则会输出:“Derived”。
#include <iostream>
#include <memory>
struct Base {
void bar();
virtual void foo() {std::cout<<"Base";}
};
struct Derived : Base {
void foo() {std::cout<<"Derived";}
};
int main() {
std::shared_ptr<Base> p = std::make_shared<Derived>();
p->foo();
}
这里“覆盖/重写”的必须要求是函数的特征标(包括参数的数目、类型和顺序)以及返回值都必须与基类中的函数一致,否则就属于重载了。<