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?
Здравствуйте, Аноним, Вы писали:
А>А>//foo();//GCC error:abstract virtual ‘virtual void A::foo()’ called from constructor
А> //VC2005 ok!!!
А>A::foo(); //Действительно ли ok или UB?
this->>foo();//Действительно ли ok или UB?
А>
Все варианты UB.
Поищи по форуму — тема вызова виртуальных функций из конструктоа/деструктора обсуждалась много раз.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
B>>Все варианты UB.
E>Почему UB? Функция же определена? Просто A::foo() оба раза позовётся и всё...
+1
Вариант
A::foo(); не является "виртуальным вызовом" (10.3/12), так что тут все в порядке, т.е. UB нет.
В данном примере происходит то же самое:
struct B
{
virtual ~B() = 0;
};
B::~B()
{
cout << "B dtor\n";
}
struct D : public B
{
};
int main( int argc, char **argv )
{
D d;
return 0;
}
А вот
foo() this->foo() — являются "виртуальными вызовами", и как указано в 10.4/6, приводит к UB. Неважно, что foo имеет определение — она все же является чисто виртуальной.
Здравствуйте, Bell, Вы писали:
B>А вот foo() this->foo() — являются "виртуальными вызовами", и как указано в 10.4/6, приводит к UB. Неважно, что foo имеет определение — она все же является чисто виртуальной.
class A{
public:
A(){
A::foo();//ok!
this->foo();//ok???
}
Чем A::foo(); лучше this->foo() ? помоему одно и тоже. Если у A::foo() нет UD, то и this->foo() его нет.
Здравствуйте, Аноним, Вы писали:
А>Чем A::foo(); лучше this->foo() ? помоему одно и тоже. Если у A::foo() нет UD, то и this->foo() его нет.
10.3/12
Explicit qualification with the scope operator (5.1) suppresses the virtual call mechanism.
...
Так что
A::foo() и
foo()/this->foo() совсем не одно и то же.