2011-01-20 3 views
1

Я модифицирую код, что класс grand-parent - это чистый виртуальный, который включает в себя чистую виртуальную версию функции XYZ; то родительский класс then объявляет XYS как виртуальный и имеет для него реализацию. Тогда дочерний класс объявляет XYZ как регулярную функцию с другой реализацией, отличной от версии parent1 9, которая сама по себе меня сбивает с толку). Когда я вызываю функцию XYZ из другого объекта, реализация которого выполняется? родительский или дочерний? СпасибоВ чем разница между чистым виртуальным и виртуальным

+3

lol @ "grand-parent class" –

+0

XYZ ребенка тоже виртуальный; даже несмотря на то, что ключевое слово «virtual» не было написано, XYZ базы является виртуальным, так что ребенок тоже ... пока список параметров тот же. –

ответ

3

Чистые виртуальные функции не нуждаются в определении (в отличие от виртуальных функций), и они делают свой класс абстрактным. У абстрактных классов не может быть объекта, созданного, кроме случаев, когда они действуют как объект базового класса.

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

Так что, если вы звоните XYZ на grandparent* или parent*, что на самом деле указывает на child объекта, то XYZ из child объекта будет выполняться.

+1

Я понял, что название моего вопроса не имеет отношения к содержанию вопроса. Можете ли вы, пожалуйста, прочитать содержание моего вопроса и помочь, если сможете. Спасибо – user553514

+0

@ user553514: Cheeky. Он ответил на ваш вопрос. –

2

Чистая виртуальная функция означает, что класс с чистой виртуальной функцией не может быть создан. Когда родительский класс переопределяет его, он просто становится нормальной виртуальной функцией. Как только функция объявлена ​​виртуальной в базовом классе, она всегда является виртуальной, независимо от того, определяет класс наследования как виртуальный.

Редактировать: Это означает, что вызов это просто вызов виртуальной функции, как любой другой, то есть будет вызываться реализация самого производного класса.

+0

+1 за хороший ответ, но получается, что это не вопрос, который фактически задал. Смущаю, я знаю ... –

0

Чистая виртуальная функция обычно не имеет реализации и создает «абстрактность» класса.

Компилятор не позволит создать экземпляр класса, который является абстрактным. Любой класс, полученный из этого класса, остается абстрактным, если не будут реализованы все чистые виртуальные функции, которые он наследует (и он не добавляет никаких новых). Такой класс называется конкретным.

Обратите внимание, что чистой виртуальной функции может быть предоставлена ​​реализация (хотя она не может быть встроена по причинам синтаксиса). Кроме того, вы можете иметь чистый виртуальный деструктор, а затем ему должна быть предоставлена ​​реализация (даже если она пустая).

Вы указываете чистую виртуальную функцию, добавив = 0 в конце, таким образом:

virtual void foo(); // not pure 
virtual void bar() = 0; // pure virtual 
5

Когда я вызываю функцию XYZ из другого объекта, реализация которого запускается на выполнение? родительский или дочерний?

Let's find out:

struct A { 
    virtual void f() = 0; 
}; 

struct B : A { 
    virtual void f() { cout << "B::f\n"; } 
}; 

struct C : B { 
    virtual void f() { cout << "C::f\n"; } 
}; 

int main() { 
    C().f(); 
    return 0; 
} 
0
class sample 
{ 
public: 
    virtual void fun(); //virtual function 
    virtual void sun()=0; //pure virtual function 
}; 

Чистая виртуальная функция объявлена ​​путем присвоения 0, как это сделано выше.Обеспечивая определение для чистых виртуальных функций опционально, обеспечивая при этом определение виртуальных функций обязательным, в противном случае он будет не компиляции. Кроме того, вы не можете создать экземпляр класса, который определяет даже одну виртуальную функцию.

0

Виртуальная функция - это функция, которая может быть переопределена в производном классе.

Чистая виртуальная функция - это та, которая не имеет никакой реализации, и поэтому ДОЛЖЕН быть переопределенным в производном классе.

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

0

В случае виртуальной функции, если вы звоните хуг на объекте класса ребенка, всегда ребенок версии А (Child::xyz()) будет выполняться.

Это не относится к не виртуальным переопределенным методам. Тогда, если у вас был указатель Parent* ptr = &child, ptr>xyz() фактически выполнил бы Parent::xyz(). Но в вашем случае это Child::xyz(). Вот почему вы используете ключевое слово virtual.

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