class Shape { public: virtual void Draw() = 0 { // 错误,纯虚函数不能在定义时实现 } };(3) 定义它的类不可实例化:错误。虽然纯虚函数的存在会使得类变成抽象类,无法直接实例化,但是定义它的类本身并不会影响实例化的能力。需要注意的是,实例化对象时,不能直接实例化抽象类,但可以通过派生类来实现对抽象类的实例化。
在 C++ 中,抽象类是一种不能被直接实例化的类,它通常包含纯虚函数(在类中声明但没有定义的虚函数)。只有派生类实现了这些纯虚函数后,才能被实例化。
#include <iostream> // 抽象类 Animal class Animal { public: // 纯虚函数,没有实现 virtual void sound() = 0; }; // 派生类 Dog class Dog : public Animal { public: // 实现了抽象类中的纯虚函数 void sound() override { std::cout << "Dog barks" << std::endl; } }; int main() { // 不能直接实例化抽象类 Animal // Animal animal; // 错误 // 可以通过派生类 Dog 实现对抽象类的实例化 Dog dog; dog.sound(); // 输出 "Dog barks" return 0; }在上面的例子中,Animal 是一个抽象类,其中包含了一个纯虚函数 sound()。Dog 是 Animal 的派生类,并实现了 sound() 函数。因此,我们可以通过创建 Dog 的对象来实现对抽象类 Animal 的实例化。但是,直接实例化 Animal 是错误的,因为它是抽象类。
(4) 如果一个类要继承一个ADT类,必须要实现其中的所有纯虚函数:错误。派生类可以选择性地实现继承的抽象基类(ADT类)的纯虚函数。如果派生类没有实现继承的抽象基类的所有纯虚函数,那么派生类也会变成抽象类,无法直接实例化。但是,如果派生类不想实现某些纯虚函数,可以将它们再次声明为纯虚函数,从而继续延续抽象类的特性。
例如,下面的示例代码中,Shape是一个抽象类,派生类Circle和Rectangle可以选择性地实现Draw()函数。
class Shape { public: virtual void Draw() = 0; // 纯虚函数 }; class Circle : public Shape { public: void Draw() override { // 实现 Draw() 函数 } }; class Rectangle : public Shape { // 没有实现 Draw() 函数,因此 Rectangle 也是抽象类 };
class AbstractClass { public: virtual void DoSomething() = 0; // 纯虚函数 };
纯虚函数的特点是它没有实现,因此不能在抽象类中直接调用。派生类继承抽象类后,必须实现抽象类中的纯虚函数,否则派生类也会成为抽象类。通过实现纯虚函数,派生类可以为其提供具体的功能实现。
纯虚函数的主要作用是定义接口规范,强制派生类实现特定的功能,从而实现多态性和多继承等面向对象编程的特性。同时,纯虚函数也可以在抽象类中提供默认的实现,这样派生类可以选择性地覆盖该实现。
2.在C++中怎么判断 定义它的类中能不能实现class AbstractClass { public: virtual void DoSomething() = 0; // 纯虚函数,只有声明没有定义 };
上面的代码中,AbstractClass是一个抽象类,因为它包含了纯虚函数DoSomething()的声明但没有提供实现。因此,定义AbstractClass的类中不能实现DoSomething()。
如果一个类的纯虚函数在类的定义中同时有声明和定义,并且提供了实现,那么这个类就可以被实例化,并且可以在定义它的类中实现纯虚函数。
class AbstractClass { public: virtual void DoSomething() = 0; // 纯虚函数的声明 virtual void DoSomethingElse() { // 纯虚函数的定义和实现 // ... } };面的代码中,AbstractClass 是一个包含了纯虚函数 DoSomething() 的抽象类,同时也提供了纯虚函数 DoSomethingElse() 的定义和实现。因此,在定义 AbstractClass 的类中可以实现 DoSomethingElse(),但不能实现 DoSomething(),因为它只有声明没有实现。