首页 > 试题广场 >

有以下类定义 #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];
所以D选项?
shape s4[3];
????
发表于 2020-12-28 18:06:38 回复(0)
抽象类不能实例化对象,但是可以定义指针和引用。
发表于 2020-11-17 09:16:55 回复(0)
抽象类无法实例化出对象
发表于 2019-02-16 20:54:02 回复(0)
但是当一个类中有一个或多个纯虚函数的时候,这个类就自动成为了抽象类,即不可以实例化
发表于 2020-09-18 16:50:03 回复(0)
麻辣鸽蛋,看错题目了

在给定的类定义中,rectangle类是shape类的派生类,并实现了纯虚函数area()。下面我们逐个分析选项来确定编译时是否有语法错误。

A.shape *s1 = &r;这是合法的,因为rectangle类是shape类的派生类,可以将指向基类对象的指针指向派生类对象。

B.shape &s2 = r;这也是合法的,因为引用变量s2也可以引用派生类对象。

C.shape s3 = r;这是不合法的,因为我们不能创建抽象基类的对象。shape是一个抽象类,它包含了纯虚函数area(),无法直接实例化。

D.shape s4[3];这是不合法的,因为我们同样无法创建抽象基类的数组对象。


发表于 2023-10-20 19:55:45 回复(0)
抽象类不能实例化对象,但是可以定义指针和引用
发表于 2020-12-03 08:29:47 回复(0)
D 抽象类不能实例化,但是可以定义成指针或者引用。
发表于 2023-03-16 18:40:02 回复(0)
选项A和B是正确的,而C是错误的,原因如下:

A. `shape *s1 = &r;`
这个语句创建了一个指向`shape`类的指针`s1`,并让它指向一个`rectangle`类型的对象`r`。由于`rectangle`类是`shape`类的公有派生类,且`shape`类中的`area()`函数是虚函数,因此可以使用基类指针`s1`来指向派生类对象`r`,并且能够通过这个指针调用到`rectangle`类中重写的`area()`函数。这是多态的一个典型应用,所以该语句是正确的。

B. `shape &s2 = r;`
这个语句创建了一个对`shape`类的引用`s2`,并让它引用一个`rectangle`类型的对象`r`。类似于指针的情况,这里也是允许的,因为`rectangle`是`shape`的派生类,且引用`s2`可以访问到通过虚函数机制重写后的`area()`函数。这也是多态性的一种体现,因此该语句也是正确的。

C. `shape s3 = r;`
这个语句尝试创建一个`shape`类型的对象`s3`,并用`rectangle`类型的对象`r`去初始化它。这里的问题在于,`shape`类是一个抽象类,因为它包含了一个纯虚函数`virtual int area()=0;`。抽象类不能被实例化,也就是说你不能直接创建一个`shape`类型的对象。此外,即使`shape`不是抽象类,这种赋值也是不被允许的,因为这涉及到对象切片(Object Slicing),即将派生类对象转换为其基类对象时,派生类中超出基类的部分会被“切掉”。在这个上下文中,`rectangle`对象`r`的具体信息(比如它的`setLength`设置的长度和宽度)将会丢失,因此这个语句是错误的。
发表于 2024-05-17 20:07:00 回复(0)
抽象类不能实例化对象,但是可以定义指针和引用
编辑于 2024-03-08 11:57:22 回复(0)
如果shape不是抽象类  答案是什么呀
发表于 2020-12-29 19:37:02 回复(0)