首页 > 试题广场 >

阅读下面的 C++ 代码,关于 ptrX,ptrY,ptrZ

[单选题]
阅读下面的 C++ 代码,关于 ptrX,ptrY,ptrZ 三个指针,下面说法正确的是()
#include <iostream>
using namespace std;

class BaseX {
public:
    virtual ~BaseX() {};
    virtual void FunctionX() {};
};

class ClassY : public BaseX {
public:
    virtual void FunctionY() {};
};

class FatherZ :public ClassY {
};

int main() {
    FatherZ aObject;
    BaseX* ptrX = &aObject;
    ClassY* ptrY = &aObject;
    FatherZ* ptrZ = &aObject;
    return 0;
}
  • ptrX,ptrY,ptrZ 的取值相同
  • ptrZ = ptrX + ptrY
  • ptrX 和 ptrY 不相同
  • ptrZ 不等于 ptrX 也不等于 ptrY
三个单继承,指针位置无偏移,地址全部相同
发表于 2019-08-04 13:26:45 回复(0)
考指针,指针本身的值是执行对应的对象的地址,他本身的地址是&ptrZ 这里说的
ptrX,ptrY,ptrZ是指它们指向的内容,因此都相等
发表于 2021-02-06 23:26:39 回复(0)
意思是3个指针都赋的&aObject的首地址,所以与虚表指针动态联编无关是吗。如果去掉&aObject前的&就不一样了?
发表于 2021-03-17 09:28:43 回复(5)
三个指针指向同一个地址,所以三者相同
发表于 2023-06-21 13:00:10 回复(0)

Base* pb = new Child(1),这里先将pb所指对象的i初始化为1

pb->func1()注意,Base中的func1()并不是一个虚拟(virtual)函数,并且pb是一个Base类型的指针,所以调用的是Base的func1()函数(这里并没有展现出多态性),i变成了10

而在func1函数中又调用了func2()函数,由于Base中的func2函数是一个virtual函数,所以会调用Child的func2()函数(多态性),i变成了12


Base类的func1()函数其实是这样的:

void func1() { 
    i *= 10;
    (*this->__vptr__Base[1])();    // 在vtbl中寻找func2()函数的地址
}

图片说明
因为Base类中存在virtual函数,因此Child类的对象中会存在一个vptr指针(虚函数指针)指向vtbl(虚函数表),由于多态性,this指针在运行期间会在vtbl中寻找func2()函数的地址,即(*this->__vptr__Base[1])(),注意,这个func2()函数是Child的而不是Base的

发表于 2022-02-21 15:20:54 回复(0)
*ptrx,*ptry,*ptrz取指针中的内容,都是堆内存中的aObject对象,取值是相同的
发表于 2020-08-05 20:44:35 回复(0)
子类没有重写父类的虚函数,虚函数表里面还放着父类的虚函数地址,所以都一样。
编辑于 2023-12-05 22:59:14 回复(0)
三个指针都指向了 aObject 对象 ,有虚函数指针,位置在最前面,取值,===*ptrX===*ptrY===*ptrZ
指向的地址都是对象的首地址,地址也一样。
发表于 2023-10-31 22:54:00 回复(0)
跟偏移量没有关系,直接理解成是对对象取址然后赋值给指针变量
编辑于 2022-07-06 17:33:58 回复(0)