首页 > 试题广场 >

下面代码的输出结果是什么 ( )

[单选题]
下面代码的输出结果是什么 (      )
#include <iostream>
using namespace std;
class A
{   
    public: void virtual f() 
    {       
        cout << "A" << " ";
    }
};
class B : public A
{   
    public: void virtual f()
    {       
        cout << "B" << " ";
    }
};
int main(){
    A *pa = new A();
    pa->f();
    B *pb=(B *)pa;
    pb->f();    
    delete pa, pb;
    pa=new B();
    pa->f();
    pb=(B *)pa;
    pb->f();
    return 0;
}

  • A A B A
  • A B B A
  • A A B B
  • A A A B
始终记住一点, 当类中含有虚函数的时候,创建该类的对象时,该对象的首地址即为虚函数表的地址,无论对该对象进行怎样的类型转换,该对象都只能访问自己的虚函数表
发表于 2018-09-15 09:10:02 回复(4)
前半半部分创建了一个A对象,无论指针怎么来回弄,指针类型表示可以“访问的量”(读取多大的数据罢了)对象是没变的
发表于 2020-11-05 17:22:54 回复(0)
如果使用指向对象的引用或指针来调用虚方法,程序将使用为对象类型定义的方法,而不使用为引用或指针类型定义的方法。
发表于 2020-10-13 10:59:51 回复(0)
这段代码涉及了类的继承和虚函数的概念。下面是代码的输出结果及其解释: 输出结果: A A B B 解释: 1. 首先,创建了一个指向 A 类对象的指针 `pa`,然后调用 `pa->f()`。由于 `f()` 在类 A 中被声明为虚函数,因此会根据实际对象的类型来调用适当的函数。因为 `pa` 指向的是 A 类对象,所以输出 "A"。 1. 接下来,将 `pa` 的类型强制转换为 B 类型指针 `pb`,然后调用 `pb->f()`。在这里,强制转换将 `pa` 视为 B 类型指针,尽管实际上它指向的是 A 类对象。由于 `f()` 在类 B 中被声明为虚函数,程序会尝试调用 B 类的实现。然而,由于 `pa` 指向的是 A 类对象,所以输出 "B" 是不正确的,并且这样的类型转换是不安全的。 1. 在删除 `pa` 和 `pb` 之前,将 `pa` 的类型重新赋值为 B 类型指针,并再次调用 `pa->f()`。现在,`pa` 指向 B 类对象,因此输出 "B"。 1. 接着,将 `pa` 的类型强制转换为 B 类型指针 `pb`,然后调用 `pb->f()`。由于 `pa` 指向 B 类对象,输出 "B"。 需要注意的是,进行指针类型的强制转换时需要非常小心,确保转换的类型是正确的,否则可能导致未定义的行为。在上述代码中,将 `pa` 强制转换为 `B*` 类型是不安全的,且不符合代码的意图。
发表于 2023-08-18 14:04:07 回复(1)
C
发表于 2018-09-15 13:34:58 回复(0)
我怎么感觉是ABBB?

发表于 2023-03-13 20:57:39 回复(1)
C
发表于 2018-09-16 09:11:31 回复(0)
搞不懂
发表于 2023-08-31 12:18:09 回复(0)
good job!
发表于 2023-04-11 11:40:46 回复(0)
带有虚函数的类析构函数不写成虚函数吗? 还有delete pa, pb这是什么写法
发表于 2022-09-18 01:00:12 回复(0)
<p>定义虚函数virtual关键字不应该在void前面吗?</p>
发表于 2020-08-22 21:50:37 回复(0)