首页 > 试题广场 >

有以下类定义 #include usin...

[不定项选择题]
有以下类定义
#include <iostream>
using namespace std;

class shape {
public:
    virtual int area() = 0;
};

class rectangle :public shape {
public:
    int a, b;
    void setLength(int x, int y) { 
        a = x; b = y;
    }
    int area() { 
        return a * b; 
    }
};
若有语句定义rectangle r; r.setLength(3,5); 则编译时无语法错误的语句是(      )
  • shape *s1=&r;
  • shape &s2=r;
  • shape s3=r;
  • shape s4[3];
A:将r转换为基类shape型指针s1;
B:将r转换为基类shape型引用s2
A、B正确。子类可以转换为基类;但是,基类不能转换为子类;
C:应用默认拷贝构造函数(浅拷贝)将r(默认转换为基类)拷贝给s3
D:创建shape型数组(默认构造函数初始化数组);
shape 中 area函数是纯虚函数,含有纯虚函数的类是抽象类,不能实例化。
C,D都将shape实例化了所以  C、D错误;
如果area是普通虚函数则C、D正确。
编辑于 2020-10-04 09:58:06 回复(2)
带有=0函数的类是抽象类,抽象类不能实例化
发表于 2020-08-14 12:03:06 回复(0)

在这个类定义中,shape 是一个抽象类,rectangle 是它的一个派生类。由于 area 函数是纯虚函数,所以 shape 是一个抽象类,不能被实例化。因此,选项 C 和 D 都是不正确的。

选项 A 中的语句shape *s1 = &r;是正确的。由于 rectangle 是 shape 的派生类,所以可以使用指向 rectangle 对象的指针来表示 shape 对象。因此,将 r 的地址赋给 s1 是合法的,并且可以通过 s1 调用 area 函数。

选项 B 中的语句shape &s2 = r;也是正确的。由于 rectangle 是 shape 的派生类,所以可以使用引用来表示 shape 对象。因此,将 r 赋给 s2 是合法的,并且可以通过 s2 调用 area 函数。

选项 C 中的语句shape s3 = r;是不正确的。由于 shape 是一个抽象类,不能被实例化。因此,将 r 赋给 s3 是不合法的。

选项 D 中的语句shape s4[3];是不正确的。由于 shape 是一个抽象类,不能被实例化。因此,创建一个 shape 类型的数组是不合法的。

发表于 2023-10-24 20:05:42 回复(0)
D中将抽象类进行了实例化,所以不能选
发表于 2022-03-05 07:53:26 回复(0)
<p>c++引用</p>
发表于 2020-10-25 17:57:45 回复(0)