我在书中读到,如果将基本指针指向派生对象,然后递增该指针,则它将不会指向下一个派生对象。它将指向下一个基础对象。但是如何?我尝试了以下方法:
#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()
函数的值。
答案 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];
,当您将指针分配给其他类型时,编译器也会丢失此信息。
您正在做什么,即访问指向单个对象的增量指针是未定义的行为。由于不能保证对象在内存中的位置。