Date: Fri, 20 Jan 2023 07:55:55 +0100
Hi everyone,
I checked the following code from one of my student:
class I{
public:
virtual ~I(){}
virtual void print(){
printf("hello %p\n",this);
}
virtual void f()=0;
};
class B : public virtual I{
int i,j;
public:
~B(){}
virtual void f(){
printf("B %p\n",this);
}
};
void f(I *i){
for(int j=0;j<5;++j)
{
i->print();
i->f();
printf("i=%p ",i);
i++; // PROBLEM IS HERE
printf(" => %p \n",i);
}
}
int main(){
B b[]={B(),B()};
printf("B: %p %p\n",b,b+1);
f(b);
}
As you can see, I is a non instantiable type as it has one pure virtual
method. My concern is about the line "i++": I believed it will lead to
an error or at least a warning (g++ 11.3.0)... Indeed, I can not imagine
a valid case where doing arithmetic on a pointer of a type with pure
virtual function can be valid.... Shouldn't the standard forbid such
arithmetic?
Julien.
I checked the following code from one of my student:
class I{
public:
virtual ~I(){}
virtual void print(){
printf("hello %p\n",this);
}
virtual void f()=0;
};
class B : public virtual I{
int i,j;
public:
~B(){}
virtual void f(){
printf("B %p\n",this);
}
};
void f(I *i){
for(int j=0;j<5;++j)
{
i->print();
i->f();
printf("i=%p ",i);
i++; // PROBLEM IS HERE
printf(" => %p \n",i);
}
}
int main(){
B b[]={B(),B()};
printf("B: %p %p\n",b,b+1);
f(b);
}
As you can see, I is a non instantiable type as it has one pure virtual
method. My concern is about the line "i++": I believed it will lead to
an error or at least a warning (g++ 11.3.0)... Indeed, I can not imagine
a valid case where doing arithmetic on a pointer of a type with pure
virtual function can be valid.... Shouldn't the standard forbid such
arithmetic?
Julien.
Received on 2023-01-20 06:55:59