От: | Аноним | ||
Дата: | 09.06.08 08:00 | ||
Оценка: |
class A{
public:
A(){
//foo();//GCC error:abstract virtual ‘virtual void A::foo()’ called from constructor
//VC2005 ok!!!
//UB
A::foo();//ok?
this->foo();//ok?
}
virtual ~A(){
//foo();//GCC error: abstract virtual `virtual void A::foo()’ called from destructor
//VC2005 ok!!!
//UB
A::foo();//ok?
this->foo();//ok?
}
virtual void foo()=0;
};
void A::foo(){ cout<<"Class A"<<endl; }
class B: public A{
public:
B(){
this->foo();
}
~B(){}
void foo(){
cout<<"Class B"<<endl;
}
};
int main() {
B obj;
B *b=new B;
A *a=b;
a->foo();
delete b;
return 0;
}
10.4 Abstract classes
6 Member functions can be called from a constructor (or destructor) of an abstract class; the effect of making a vir¬tual call (10.3) to a pure virtual function directly or indirectly for the object being created (or destroyed) from such a constructor (or destructor) is undefined.
//foo();//GCC error:abstract virtual ‘virtual void A::foo()’ called from constructor
//VC2005 ok!!!
A::foo(); //Действительно ли ok или UB?
this->foo();//Действительно ли ok или UB?