指向第二个基础对象的指针

时间:2019-07-19 07:56:52

标签: c++ oop

我在书中读到,如果将基本指针指向派生对象,然后递增该指针,则它将不会指向下一个派生对象。它将指向下一个基础对象。但是如何?我尝试了以下方法:

#include <iostream>
using namespace std;


class Base{
    int x;
    public:
        void setx(int x){
            this->x = x;
        }
        int getx(){
            return x;
        }
};

class Derived : public Base{
    int y;
    public:
        void sety(int y){
            this->y = y;
        }

        int gety(){
            return y;
        }
};


int main()
{
Base *p;// pointer to base type

Base base_object; // object of base
Derived derived_object;
Base secondBaseObj;


//use p to access the base object

p = &base_object;
p->setx(10);
cout << "Base object value of x: "<< p->getx()<<endl;
base_object.setx(100);
cout << "Base object value of x: "<< p->getx()<<endl;

p->setx(20);
cout << "Base object value of x: "<< base_object.getx()<<endl;




p = &derived_object;
derived_object.sety(15);
//cout << "Derived object value of y: "<< p->gety()<<endl;
//although base pointer can be used to point a derived object, you can access only those members
// of the derived object that are inherited from the base class;


p = p+1;
secondBaseObj.setx(30);
cout << "SecBase object value of x: "<< p->getx()<<endl;

return 0;
}

输出:

Base object value of x:10
Base object value of x:100
Base object value of x:20
SecBase object value of x:15

我将指针增加了1,并调用了gex()函数,但是它返回了派生类gety()函数的值。

2 个答案:

答案 0 :(得分:2)

您可能对这本书有误解。递增指针背后的想法是当对象连续时,递增指针将使指针指向下一个对象。

但是什么时候对象是连续的?一般规则是两个对象不是连续的,除非标准另有说明。而且这些情况非常有限:普通数组T[N]std::vector<T>std::array<T,N>std::basic_string<Ch>std::valarray<T>(有条件)和std::complex<T>

在所有这些情况下,T对象是连续的,但它们的基址不是连续的。

答案 1 :(得分:0)

当您做p = p + 1;时,编译器假定您正在访问数组元素,即在此之前有类似的东西:

Base storage[2];
Base *p = storage;

即使您将存储声明为Derived storage[2];,当您将指针分配给其他类型时,编译器也会丢失此信息。

您正在做什么,即访问指向单个对象的增量指针是未定义的行为。由于不能保证对象在内存中的位置。