纯虚函数与抽象类 9
1. 纯虚函数:
- 可以没有函数体的虚函数。
- 格式:
virtual 返回类型 函数名(参数列表) = 0;
- 作用:将派生类强制实现该函数。
代码示例 1 (无纯虚函数):
c++
class Animal {
public:
virtual void speak() { std::cout << "Animal speaking..." << std::endl; }
};
class Dog : public Animal {
public:
// 可以选择不实现 speak() 函数,将继承基类的实现
};
int main() {
Dog dog;
dog.speak(); // 输出: Animal speaking...
return 0;
}
代码示例 2 (有纯虚函数):
c++
class Animal {
public:
virtual void speak() = 0; // 纯虚函数
};
class Dog : public Animal {
public:
void speak() override { std::cout << "Woof!" << std::endl; } // 必须实现 speak()
};
int main() {
Dog dog;
dog.speak(); // 输出: Woof!
return 0;
}
2. 抽象类:
- 包含至少一个纯虚函数的类称为抽象类,也叫做纯虚类。
- 抽象类不能实例化,即不能创建该类的对象。
- 抽象类主要用于定义接口,规范派生类的行为。
- 很多编程语言中的抽象类也叫接口类。
关于"虚"的概念:
- 虚继承: 解决菱形继承问题,避免数据冗余和二义性。
- 虚基类: 在虚继承中,被继承的公共基类称为虚基类。
- 虚函数: 使用
virtual
关键字声明的成员函数,允许在运行时动态绑定(多态)。 - 纯虚函数: 没有函数体的虚函数,使用
= 0
声明。 - 纯虚类/抽象类: 包含至少一个纯虚函数的类。
代码示例:
c++
class Shape {
public:
virtual double getArea() = 0; // 纯虚函数
};
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) {}
double getArea() override { return 3.14159 * radius * radius; }
};
int main() {
//Shape shape; // 错误: 不能实例化抽象类
Circle circle(5);
std::cout << "Circle area: " << circle.getArea() << std::endl;
return 0;
}