首页 > 试题广场 >

以下关于C++的描述中哪一个是正确的:

[单选题]
以下关于C++的描述中哪一个是正确的:
  • 任何指针都必须指向一个实例
  • 子类指针不可以指向父类实例
  • 任何引用都必须指向一个实例
  • 引用所指向的实例不可能无效

答案C
这里主要说一下 B 选项,在已有知识结构中。我们仅仅知道父类指针可以指向子类对象。
但是反过来,利用子类指针指向父类对象其实也是可以的。仅仅限于编译成功。但是使用时会有问题。比如下面代码:

#include <iostream> 
using namespace std;
class Base {
public:
    int a = 2;
    void pr() {
        cout << "Base::pr" << endl;    
    }
};

class Derive: public Base {
public:
    int b = 3;
    void pr() {
        cout << "Derive::pr" << endl;    
    }
};
int main (int argc, char ** argv) {
 Base Bp1;
    Derive *D1 = (Derive*)(&Bp1); // 这种强制类型转换可以
    Bp1.pr();
    D1->pr();
    cout << "D1->b:" << D1->b << endl;
    cout << "D1->a:" << D1->a << endl;
    return 0;
}

编译器版本: g++ (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609
此时编译成功。如果上面利用 dynamic_cast 进行强制转换,此时会失败。
运行结果:

Base::pr
Derive::pr
D1->b:0
D1->a:2

从结果可以看出。B 选项中实际上子类指针可以指向父类实例的。但是这里可以发现,我们打印 D1->b变量时,此时变量为 0。然后我们调用 D1->pr() 时,能够打印出子类 pr 函数。我们打印 D1->a 时,也能顺利打印为 2。
下面解释原因:
1)为什么子类能够打印函数 pr()?

因为子类成员函数归类所有,不是归实例所有

2)为什么子类打印 b 成员变量时,为 0。(这里也可能是其他数)?

因为实例本身是父类对象。而成员变量是归实例对象所有。因此这里实际上内存中的成员变量就有 a =2 变量。但是这里又能成功访问 b。是因为编译器在编译子类指针 D1 时,认为内存中有 b 这个变量。所以编译能够成功。但是实际上,这块内存是父类对象的。根本没有 b 这个变量。因此,这里打印 b 时,结果就是随机值。

发表于 2019-02-21 22:29:35 回复(0)
引用指向局部对象就可能无效
发表于 2017-03-27 08:59:05 回复(4)
引用就是其他变量或对象的别名,所以不能只有声明
发表于 2017-06-21 18:23:27 回复(0)

dynamic_cast动态转换 可以使得子指父

发表于 2019-03-07 00:27:43 回复(0)
那形参定义的引用怎么说呢??????
发表于 2018-08-14 22:28:28 回复(0)
引用即为一个变量的别名,所以必须实例化,而不能只有声明,而指针变量可以为null
发表于 2017-09-19 16:55:32 回复(0)
争议应该是BC,C 引用作为形参 可以不用先指定实例吧? B 觉得没毛病。。
发表于 2018-09-09 19:43:55 回复(2)
子类指针可以指向父类实例:只要子类只使用父类的基类部分就不会出错,一旦子类指针指向了父类新添加的数据成员就会发生错误;
发表于 2018-05-14 15:08:38 回复(1)
应该是父类指针可以指向子类对象吧。子类对象如果指向父类对象,那不就可以使用子类方法了
发表于 2017-08-19 10:58:53 回复(2)
D为什么不对呢???
发表于 2017-02-28 21:28:55 回复(1)
别出这种有歧义,含糊不清,没有共识的题目,OK吗草
编辑于 2024-04-21 17:32:13 回复(0)

C. 任何引用都必须指向一个实例

这是因为在 C++ 中,引用是一种别名,它必须在声明时被初始化,并且在其生命周期内一直引用某个有效的对象。引用不能在不指向任何实例的情况下存在。因此,选项 C 描述的是引用的正确行为。

其他选项的陈述存在一些问题:

A. 任何指针都必须指向一个实例 - 这是不正确的,指针可以为空(null)。

B. 子类指针不可以指向父类实例 - 这也是不正确的,子类指针可以指向其父类的实例。

D. 引用所指向的实例不可能无效 - 这是不正确的,引用必须在其生命周期内引用有效的对象,但一旦对象被销毁,引用就变得无效。

发表于 2023-12-02 09:13:38 回复(0)
D是错的,引用指向的实例可能无效,这样的话引用变成无效的而已
发表于 2023-11-21 23:23:56 回复(0)
A项, int *p=0;就可以
发表于 2019-05-08 10:16:49 回复(0)
B选项也是对的把
class A{};
class B{};
int main()
{
    A a;
    B* p = &a ; // 这个编译器直接报错把
}
发表于 2018-09-07 20:11:36 回复(0)
引用作为形参的时候不是可以不用指向实例么?
发表于 2018-03-25 11:10:36 回复(1)
int& fun(){int a =10;return a;} 引用的是一个返回的局部变量(无效)
发表于 2018-03-15 08:59:33 回复(0)
常量的引用怎么说,常量也算实例吗? const int &a = 0;
发表于 2017-08-15 11:20:14 回复(0)
指针可以为NULL,引用必须初始化,实现多态时,不就是子类指针指向父类对象么
发表于 2017-06-06 21:19:14 回复(1)
c
发表于 2017-04-10 15:31:08 回复(0)