c++虚函数,纯虚函数,虚析构函数,虚函数表分别是什么,有什么区别,代码举例
时间: 2024-06-09 20:07:01 浏览: 176
C++_虚函数和纯虚函数区别
在 C++ 中,虚函数是一种特殊的函数,它可以被子类重写并通过父类指针或引用进行调用。虚函数通过虚函数表(vtable)实现多态。
1. 虚函数
虚函数是在基类中使用 virtual 关键字声明的函数。当子类继承基类并重写虚函数时,可以通过父类指针或引用调用子类的虚函数。
虚函数的用法如下:
```c++
class Animal {
public:
virtual void eat() {
std::cout << "Animal is eating." << std::endl;
}
};
class Cat : public Animal {
public:
void eat() override {
std::cout << "Cat is eating." << std::endl;
}
};
int main() {
Animal* animal = new Cat();
animal->eat(); // 输出 Cat is eating.
delete animal;
return 0;
}
```
2. 纯虚函数
纯虚函数是没有实现的虚函数,它的声明使用 "= 0" 标记。纯虚函数必须在子类中被重写才能实现多态。
纯虚函数的用法如下:
```c++
class Animal {
public:
virtual void eat() = 0;
};
class Cat : public Animal {
public:
void eat() override {
std::cout << "Cat is eating." << std::endl;
}
};
int main() {
Animal* animal = new Cat();
animal->eat(); // 输出 Cat is eating.
delete animal;
return 0;
}
```
3. 虚析构函数
虚析构函数是在基类中使用 virtual 关键字声明的析构函数。在使用基类指针或引用删除子类对象时,需要使用虚析构函数以确保正确地释放资源。
虚析构函数的用法如下:
```c++
class Animal {
public:
virtual ~Animal() {
std::cout << "Animal is destroyed." << std::endl;
}
};
class Cat : public Animal {
public:
~Cat() override {
std::cout << "Cat is destroyed." << std::endl;
}
};
int main() {
Animal* animal = new Cat();
delete animal; // 输出 Cat is destroyed. Animal is destroyed.
return 0;
}
```
4. 虚函数表
虚函数表是一个存储虚函数指针的数组,它被用来实现多态。每个包含虚函数的类都有一个虚函数表,存储在对象的内存布局中。
虚函数表的内部实现是编译器依据虚函数的重载情况生成的,开发者无法直接操作虚函数表。
虚函数表的用法不需要手动编写,它是由编译器自动生成的。
以上是虚函数、纯虚函数、虚析构函数和虚函数表的简要介绍和用法。
阅读全文