1. 理解C++中的基类指针与子类调用
在C++面向对象编程中,基类指针指向子类对象是一种常见且强大的技术手段。这种机制允许我们编写更通用、更灵活的代码,特别是在处理具有继承关系的类体系时。让我们从一个实际场景开始理解这个概念:
假设你正在开发一个图形编辑器程序,其中有一个基类Shape和多个派生类Circle、Rectangle等。当你需要管理各种图形对象时,使用基类指针Shape*来统一处理所有图形对象会非常方便。
cpp复制class Shape {
public:
virtual void draw() const {
cout << "Drawing a generic shape" << endl;
}
};
class Circle : public Shape {
public:
void draw() const override {
cout << "Drawing a circle" << endl;
}
};
class Rectangle : public Shape {
public:
void draw() const override {
cout << "Drawing a rectangle" << endl;
}
};
在这个例子中,Shape是基类,Circle和Rectangle是派生类。基类中的draw()函数被声明为virtual,这意味着它可以在派生类中被重写(override)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 虚函数的工作原理与动态绑定
2.1 虚函数表(vtable)机制
当我们在基类中将函数声明为virtual时,编译器会为该类创建一个虚函数表(vtable)。这个表包含了指向类中虚函数的指针。每个派生类也会有自己的虚函数表,其中包含继承自基类的虚函数指针和新增的虚函数指针。
cpp复制Shape* shape1 = new Circle();
Shape* shape2 = new Rectangle();
shape1->draw(); // 输出: Drawing a circle
shape2->draw(); // 输出: Drawin
