2015-04-08 3 views
-1

В следующем коде у нас есть два класса в каждом из них два метода: один - виртуальный, а второй - не виртуальный. Я не понимаю, что на самом деле происходит, когда я запускаю этот код. В этом случае и с какой функцией (1,2,3) система использует витальную или не виртуальную функцию? Во всех случаях я писал в комментариях то, что я получил при запуске кода. Я немного запутанным ... Заранее спасибовиртуальный метод против не виртуального метода в том же классе

class cFather { 
    public: 
      void print()  { cout<<” 1) cFather\n”;} 
    virtual void print() const { cout<<” 2) cFather\n”}; 
}; 

class cSon : public cFather { 
    public: 
    virtual void print()  { cout<<” 3) der\n”; } 
    void print() const { cout<<” 4) der\n”; } 
}; 

void function1 (const cFather& o) 
{ 
    o.print(); 
} 

void function2 (const cFather o) 
{ 
    o.print(); 
} 

void function3(cFather o) 
{ 
    o.print(); 
} 

A)

void main () 
{ cFather o; 
function3(o); } 
// 1) CFather 

B)

void main () 
{ cSon t; 
function1(t); } 
// 4) der 

C)

void main () 
{ cFather * o; 
cSon t; 
o = &t; 
o->print(); } 
// 1) cFather 

D)

void main () 
{ cFather o; 
function2(o); } 
// 2) cFather 
+2

Это не «единственная разница»; один - const, другой - нет. –

+0

Какое поведение, в частности, вы не понимаете? –

+0

Вы правы, я изменил его! – Laura

ответ

1

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

Вы должны понимать, как работают виртуальные методы. Проще говоря, компилятор сохранит в вашем объекте указатель на функцию для каждого виртуального метода этого класса. Когда вы вызываете виртуальный метод с помощью указателя o ссылки, вызывается функция, указанная соответствующим указателем в вашем объекте. Таким образом, звонок будет разрешен во время выполнения.

Таким образом, только function1 может динамически вызывать метод, поскольку он является единственным аргументом, переданным по ссылке, а не по значению.

Корпус «D» не разрешается во время выполнения, который должен быть вызван методом; он просто выбирает второй метод, потому что он вызывается на объекте const. Он будет вести себя одинаково, даже если он не является виртуальным.

+0

Я знаю это, но почему в случае D система использует виртуальную, например? – Laura

+0

@Laura: он не использует виртуальную, потому что это 'virtual', а потому что это' const'. –

+0

Спасибо за ваши ответы ... Ты мне очень помог – Laura

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