2013-02-19 3 views
0

Как я могу использовать чистую виртуальную функцию «pvf()» здесь? Может ли кто-нибудь пролить свет на это? ................................................. ..............Как я могу использовать чистую виртуальную функцию?

#include<iostream> 

using namespace std; 

class a 
{ 
public: 
    a() 
    { 
     this->pvf(); 
     this->p(); 
    } 

    virtual int pvf() = 0; 

    virtual void p() 
    { 
     cout << "\n p fun"; 
    } 
}; 

int a::pvf() 
{ 
    cout<<"\n pure"; 
} 

class b : public a 
{ 
    int i,j,k; 

    void o() 
    { 
     cout<<"\n der"; 
    } 
}; 

int main() 
{ 
    //b b1; 
} 
+2

вы имели в виду пф()? p() не является чистым. – Bryan

+1

Ваш отступ совершенно изобретателен. –

ответ

6

Внутри конструктора типа a объект по-прежнему относится к типу a. Любой вызов виртуальной функции там будет не будет отправлен любой переулок ниже a в иерархии. Это означает, что вызов this->pf(); внутри a::a(); не удастся.

Если вы действительно хотите вызвать a::pf, то вы должны отключить динамической диспетчеризации для этого вызова, и вы сделаете это, добавив дополнительную квалификацию: a::pf() (или this->a::pf();)

+0

В чем смысл вызова чистого виртуального метода? В любом случае, разрешает ли языковая спецификация? – Spook

+2

@Spook: язык разрешает это, и может быть удобно принудительно использовать подтипы для реализации функции, но обеспечить разумное значение по умолчанию. «Чистый» квалификатор потребует от пользователя предоставления переопределения в производном типе, даже если это просто переадресационный вызов 'int b :: pf() {return a :: pf(); } '- отображает реализацию по умолчанию. –

+1

Эй ... не знал, что это возможно. Еще один вопрос. +1 для дополнительного объяснения. – Spook

2

Я предполагаю, что вы имеете в виду pf, так как p не является чистым. Вы можете вызвать его, указав невиртуальный вызов:

this->a::pf(); 

Или, возможно, вы спрашиваете, почему вы наблюдаете за чистую виртуальную функцию вызывается из конструктора, а не то, что переопределение предположительно отсутствует производный класс?

Вызов виртуальной функции от конструктора или деструктора выбирает функцию в соответствии с построенным классом, а не конечным производным классом. Если функция чиста в текущем классе, то поведение не определено - она ​​может вызывать чистую функцию, если она имеет реализацию, или вызывает некоторое другое переопределение или сбой или что-то еще, что вы можете себе представить.

+0

Не совсем понимаю нижний предел. Вопрос неясно, задает ли OP вопрос о том, как называется функция, или если он действительно хочет, чтобы вызов произошел и не знает, как ... +1 компенсировать нижний предел. –

+0

спасибо все .....! – sree

0
#include<iostream> 

using namespace std; 

class a 
{ 
public: 
    a() 
    { 

    } 

    virtual int pvf() = 0; 

    virtual void p() 
    { 
     cout << "\n p fun"; 
    } 
}; 

int a::pvf() 
{ 
    cout<<"\n pure"; 
} 

class b : public a 
{ 
    public: 
    int i,j,k; 

    int pvf(){cout<<" b pvf "; 
    } 
}; 

int main() 
{ 
    b b; 
    b.a::pvf(); 

} 
Смежные вопросы