1. 基本概念
virtual
关键字用于声明在基类中的函数为虚函数,允许在派生类中被重写,以实现多态性。
示例代码:
class Base {
public:
virtual void show() {
std::cout << "Base class show" << std::endl;
}
};
class Derived : public Base {
public:
void show() override {
std::cout << "Derived class show" << std::endl;
}
};
2. 动态绑定
动态绑定是指在程序运行时而不是在编译时决定调用哪个函数的机制。当使用指针或引用调用虚函数时,会根据对象的实际类型来调用相应的函数。
示例代码:
Base* b = new Derived();
b->show(); // 调用Derived中的show
delete b;
3. 纯虚函数和抽象类
在基类中声明纯虚函数(通过virtual
关键字后接= 0
)可以使类成为抽象类。抽象类不能被实例化,通常用于定义接口和实现继承层次结构的基础。
示例代码:
class Abstract {
public:
virtual void pureVirtualFunc() = 0;
};
class Concrete : public Abstract {
public:
void pureVirtualFunc() override {
std::cout << "Implementing pureVirtualFunc" << std::endl;
}
};
4. 虚析构函数
如果一个类是用作基类的,它的析构函数应该是虚的。这确保了通过基类指针删除派生类对象时,对象的析构过程是正确的。
示例代码:
class Base {
public:
virtual ~Base() {
std::cout << "Base destructor" << std::endl;
}
};
class Derived : public Base {
public:
~Derived() {
std::cout << "Derived destructor" << std::endl;
}
};
5. 虚函数表(Vtable)
当类使用虚函数时,编译器会为该类创建一个虚函数表(Vtable),其中包含指向类的虚函数的指针。这是动态绑定实现的底层机制。
说明: 由于Vtable是由编译器自动管理的,没有直接的示例代码展示Vtable。但了解其存在和作用对理解虚函数和多态性至关重要。