c++ virtual修饰的函数
时间: 2023-09-08 20:12:14 浏览: 123
在C++中,`virtual`关键字可以修饰类的成员函数,表示该函数是虚函数。虚函数是一种特殊的成员函数,它可以在派生类中被重写(覆盖),从而实现运行时多态性。
在基类中声明虚函数时,需要在函数声明前面加上`virtual`关键字,例如:
```c++
class Base {
public:
virtual void foo(); // 声明虚函数
};
```
在派生类中重写虚函数时,也需要在函数声明前面加上`virtual`关键字,并在函数名前加上`override`关键字,以确保该函数与基类中的虚函数相匹配。例如:
```c++
class Derived : public Base {
public:
virtual void foo() override; // 重写虚函数
};
```
需要注意的是,当一个类包含虚函数时,需要为该类定义一个虚析构函数,以确保在删除指向派生类对象的基类指针时,能够正确地调用派生类的析构函数。例如:
```c++
class Base {
public:
virtual ~Base() {} // 定义虚析构函数
};
```
总之,`virtual`关键字可以使成员函数具有多态性,使程序更加灵活和可扩展。
相关问题
c++虚函数
C++中的虚函数是一种特殊的成员函数,它可以在派生类中被重写。在基类中声明一个函数为虚函数,可以使得该函数在其任何派生类中被重写,从而实现多态性。
使用虚函数的步骤如下:
1. 在基类中声明虚函数,使用关键字“virtual”修饰该函数。
2. 在派生类中重新定义该虚函数,并使用相同的函数签名(即函数名、参数列表和返回类型)。
3. 创建基类指针,并将其指向派生类对象。
4. 调用虚函数时,根据指针指向的对象类型来调用相应的函数。
以下是一个简单的示例:
```c++
class Shape {
public:
virtual void draw() {
std::cout << "Drawing a shape." << std::endl;
}
};
class Circle : public Shape {
public:
void draw() {
std::cout << "Drawing a circle." << std::endl;
}
};
int main() {
Shape* shapePtr = new Circle();
shapePtr->draw(); // 输出 "Drawing a circle."
delete shapePtr;
return 0;
}
```
在上面的例子中,Shape类中的draw()函数被声明为虚函数,Circle类中重新定义了该函数。在主函数中,创建了一个Shape类型的指针,并将其指向一个Circle对象。当调用shapePtr->draw()时,由于shapePtr指向的对象是Circle类型,因此将调用Circle类中的draw()函数。
final修饰虚函数
final关键字可以用于修饰虚函数,表示该虚函数不能被子类重写。如果一个类中的某个虚函数被final关键字修饰,那么任何子类都不能重写该虚函数。下面是一个示例代码:
```c++
class Person {
public:
virtual void BuyTicket() final {}
};
class Student : public Person {
public:
// 下面这行代码会导致编译错误,因为BuyTicket函数被final关键字修饰
// virtual void BuyTicket() {}
};
```
在上面的代码中,Person类中的BuyTicket函数被final关键字修饰,因此Student类中不能重写该函数,否则会导致编译错误。
阅读全文