首页 > 试题广场 >

关于virtual void Draw()=0,下面说...

[单选题]
关于virtual void Draw()=0,下面说法正确的有几个?
(1)它是纯虚函数
(2)它在定义它的类中不能实现
(3)定义它的类不可实例化 
(4)如果一个类要继承一个ADT类,必须要实现其中的所有纯虚函数
  • 1
  • 2
  • 3
  • 4
有纯虚函数的类即为抽象类,子类可以是抽象类,最后一层子类需要实例化的时候,需要重写之前父类的所有纯虚函数,继承不需要,因此1.2.3对4错
编辑于 2021-07-06 15:34:09 回复(0)
(1) 它是纯虚函数:正确。virtual void Draw()=0 是一个纯虚函数声明,表示在定义它的类中没有对 Draw() 进行实现,从而使得该类变成抽象类,无法被实例化。

(2) 它在定义它的类中不能实现:正确。纯虚函数只能在声明时指定为纯虚函数,而不能在定义时实现。例如,下面的代码是错误的:
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()DogAnimal 的派生类,并实现了 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 也是抽象类
};





以下说法是正确的: 
(1) 它是纯虚函数。
 (2) 它在定义它的类中不能实现。
 (3) 定义它的类不可实例化。
说法(4)是不正确的。在C++中,如果一个类继承了一个抽象基类(含有纯虚函数的类),并且没有实现其中的所有纯虚函数,那么这个派生类也会变成一个抽象类,即该派生类也不能被实例化。但是,并不是必须实现抽象基类中的所有纯虚函数,派生类可以选择性地实现其中的一部分纯虚函数。

知识点:
1.什么是虚函数 
    在C++中,纯虚函数是在抽象类(包含至少一个纯虚函数的类)中声明的虚函数,它在抽象类中没有实际的实现,只是作为接口的定义。纯虚函数的声明形式为在函数声明的末尾加上 "= 0",例如:
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(),因为它只有声明没有实现。



发表于 2023-04-11 11:23:48 回复(0)
D错,可以不实现,派生类仍可以是抽象类
发表于 2020-08-20 11:02:16 回复(0)
有纯虚函数的类即为抽象类,子类可以是抽象类,最后一层子类需要实例化的时候,需要重写之前父类的所有纯虚函数,继承不需要,因此1.2.3对4错
发表于 2022-02-10 10:35:14 回复(0)
可以继承但不实现父类虚函数,只是该子类为抽象类,依旧不能实例化而已。
发表于 2023-09-19 01:17:24 回复(0)
(3)纯虚函数是在抽象类中定义的,抽象类是不能被实例化的。因为抽象类至少有一个纯虚函数没有实现。
发表于 2023-06-12 18:20:30 回复(0)
纯虚函数也可以叫抽象函数,一般来说它只有函数名、参数和返回值类型,不需要函数体。这意味着它没有函数的实现,需要让派生类去实现。
发表于 2022-04-17 17:37:17 回复(0)
抽象类是含有纯虚函数的类并没有实现纯虚函数函数体的类;
作用:抽象类顾名思义是一个抽象的概念,具体没有讲他怎么做;
他是在子类中实现的,这是一个具体化的过程,如果子类中没有全部实现纯虚函数的函数体部分那其子类依旧是一个抽象类。
抽象类的派生类不一定要给出纯构函数的实现,给出所有纯虚函数的实现那该派生类就不再是抽象类,而没有给出其纯虚函数的实现,那该纯虚函数依旧是抽象类
发表于 2018-08-17 18:06:47 回复(2)