在C++中,虚函数和纯虚函数都有助于实现多态性,但它们之间有几个重要的区别。
一、虚函数 (Virtual Function)
1. 定义:
当你在基类中使用 virtual 关键字声明一个成员函数时,你就创建了一个虚函数。这意味着即使通过基类指针或引用调用了该函数,实际执行的可能是派生类中重写的版本。
2. 特点:
(1) 可选重写: 派生类可以选择是否要重写虚函数。
(2) 默认实现: 基类可以提供虚函数的默认实现,但如果派生类提供了新的实现,则优先采用派生类的实现。
(3) 动态绑定: 使用基类指针或引用来访问虚函数时,会在运行时决定调用哪个具体的函数实现。
3. 例子
class Base { public: virtual void display() { std::cout << "Display from Base" << std::endl; } }; class Derived : public Base { public: void display() override { std::cout << "Display from Derived" << std::endl; } };
在这个例子中,如果你有一个 Base* ptr = new Derived() ,然后调用 ptr->display(),输出将是 "Display from Derived",这是因为发生了动态绑定。
二、纯虚函数 (Pure Virtual Function)
1. 定义:
纯虚函数是没有实现的虚函数,通常在其声明末尾添加 "= 0" 来表示。含有至少一个纯虚函数的类被视为抽象类,不能直接实例化。
2. 特点:
(1) 无默认实现: 抽象类自身不提供纯虚函数的具体实现,因此必须依赖派生类来完成。
(2) 强制重写: 所有的派生类都必须提供纯虚函数的具体实现,除非这些派生类也被标记为抽象类。
(3) 确保一致性: 提供了一种接口规范,使得所有派生类都能遵循一致的行为模式。
3. 例子
class AbstractBase { public: virtual void pureFunction() = 0; // Pure virtual function virtual void optionalOverrideableFunction() {} // Optional to be overridden }; class ConcreteDerived : public AbstractBase { public: void pureFunction() override { std::cout << "Implemented pure function in derived class" << std::endl; } };
这里,AbstractBase 是一个抽象类,因为你不能 new AbstractBase() 创建对象。然而,你可以创建 ConcreteDerived 的实例,前提是实现了所有的纯虚函数。
三、总结
总结来说,虚函数允许派生类选择性的重写某个函数,而纯虚函数则是规定了所有派生类都需要提供的某种行为。
标签:函数,实现,virtual,C++,派生类,重写,纯虚 From: https://www.cnblogs.com/hellokitty2/p/18600682