虚函数是C++中面向对象编程的重要概念,它允许我们在派生类中重写基类中的函数,从而实现动态多态性。当一个函数被声明为虚函数时,它的实际行为可以根据实例化该函数的对象所属的类类型来决定。虚函数的定义通常在类的公共部分使用`virtual`关键字,但这个关键字仅用于声明,不能用于函数的具体实现。
在基类中,我们可以声明虚函数,如:
```cpp
class Base {
public: virtual void display(); // 声明虚函数
};
```
然而,错误地将`virtual`关键字放在函数实现(如`virtual void B0::display()`)是不允许的,因为它属于函数定义,而不是函数声明。正确的做法是在基类中仅声明虚函数,然后在派生类中提供具体的实现。
例如,若我们有一个基类`Base`和派生类`Derived`,派生类可能这样定义虚函数:
```cpp
class Derived : public Base { // 单继承
public:
void display() override; // 派生类重写虚函数,需用override关键字
};
```
继承是C++中实现代码复用和扩展的关键特性。通过`class DerivedName : access_specifier BaseName1, ...`的形式,派生类`DerivedName`可以从一个或多个基类(`BaseName1, ...`)继承属性和方法。`access_specifier`可以是`public`、`protected`或`private`,分别控制继承成员的访问权限。
在这个例子中,`GraduateStudent`类继承自`Student`类,实现了单继承。`GraduateStudent`类在继承`Student`类的公共成员(如`int number`, `char name[]`, `float score`)的同时,还添加了额外的特性(如`advisor`字段),并通过`SetAdvisor`和`GetAdvisor`方法来管理顾问姓名。这体现了继承减少了代码重复,提高了灵活性。
多继承允许一个派生类同时从多个基类继承,但可能会导致命名冲突和复杂性增加,因此在设计时需要谨慎考虑。在处理多继承时,通常会使用访问修饰符来明确成员访问,以及虚基类(`virtual base class`)来避免继承层次结构中的潜在问题。
总结来说,虚函数是C++中实现动态多态的核心机制,通过继承,子类可以在不改变基类接口的情况下扩展其功能。理解和熟练运用虚函数和继承原则是C++面向对象编程中的基础,对于设计可维护、灵活的软件架构至关重要。