2012-05-14 2 views
0

Мне нравятся результаты этого кода, но мне было любопытно, можно ли назвать B :: VFunc() из main()? Я знаю, что запись B::VFunc(); внутри C вызовет его, но можно ли вызвать функцию извне объекта?Могу ли я позвонить VFunc из-за пределов объекта?

http://ideone.com/Dg8aa

#include <cstdio> 
class I { public: virtual void VFunc()=0; }; 
class B : public I { public: void VFunc() { printf("B\n"); } }; 
class C : public B { public: void VFunc() { printf("C\n"); } }; 

int main(){ 
    C v; 
    B&i = v; 
    i.VFunc(); 
} 

выход:

C 

ответ

7

Это будет делать это:

#include <cstdio> 
class I { public: virtual void VFunc()=0; }; 
class B : public I { public: void VFunc() { printf("B\n"); } }; 
class C : public B { public: void VFunc() { printf("C\n"); } }; 

int main(){ 
    C v; 
    B&i = v; 
    i.B::VFunc(); 
} 

Пример: http://ideone.com/MfyYJ

+0

Я не знал, что вы можете это сделать. +1 –

+0

Вам даже не нужна ссылка 'B', она может быть применена непосредственно к объекту' C': 'vB :: VFunc(); ' –

+0

@ DavidRodríguez-dribeas да, это возможно. Я просто скопировал код OP и применил к нему решение, но вы совершенно правы: D. – mfontanini

1

Вы можете прибегнуть к нарезка:

C v; 
B i = (B)v; 

http://ideone.com/YVI2T

Динамический тип v потерян, поэтому вызывается B::VFunc.

+0

вау +1. Я думаю, static_cast также злы :(-edit- other ppl: Другие способы ответить на мой вопрос приветствуются –

+0

Зачем нарезать объект (что подразумевает копирование), когда вы можете сделать это без накладных расходов? Что делать, если B содержит чистые виртуальные и Не удается создать экземпляр? – mfontanini

+0

http://ideone.com/6Y5LT – Flexo