10.4/6 Abstract classes
От: Аноним  
Дата: 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?
Re: 10.4/6 Abstract classes
От: Bell Россия  
Дата: 09.06.08 08:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>//foo();//GCC error:abstract virtual ‘virtual void A::foo()’ called from constructor
А>        //VC2005 ok!!!
А>A::foo();   //Действительно ли ok или UB? 
this->>foo();//Действительно ли ok или UB?
А>


Все варианты UB.
Поищи по форуму — тема вызова виртуальных функций из конструктоа/деструктора обсуждалась много раз.
Любите книгу — источник знаний (с) М.Горький
Re[2]: 10.4/6 Abstract classes
От: Erop Россия  
Дата: 09.06.08 08:45
Оценка: 1 (1)
Здравствуйте, Bell, Вы писали:

B>Все варианты UB.

Почему UB? Функция же определена? Просто A::foo() оба раза позовётся и всё...

B>Поищи по форуму — тема вызова виртуальных функций из конструктоа/деструктора обсуждалась много раз.

+1
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: 10.4/6 Abstract classes
От: Bell Россия  
Дата: 09.06.08 11:29
Оценка:
Здравствуйте, 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 имеет определение — она все же является чисто виртуальной.
Любите книгу — источник знаний (с) М.Горький
Re[4]: 10.4/6 Abstract classes
От: Аноним  
Дата: 09.06.08 11:41
Оценка:
Здравствуйте, 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() его нет.
Re[5]: 10.4/6 Abstract classes
От: Bell Россия  
Дата: 09.06.08 11:45
Оценка: 3 (2) +1
Здравствуйте, Аноним, Вы писали:


А>Чем 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() совсем не одно и то же.
Любите книгу — источник знаний (с) М.Горький
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.