c++ - How functions are resolved by compiler? -
how determined whether below call bound @ compile time or @ runtime?
object.member_fn;//object either base class or derived class object p->member_fn;//p either base class or derived class pointer   edited:
#include <iostream> using namespace std; class base {        public:           base(){ cout<<"constructor: base"<<endl;}           ~base(){ cout<<"destructor : base"<<endl;} }; class derived: public base {      //doing lot of jobs extending functionality        public:            derived(){ cout<<"constructor: derived"<<endl;}            ~derived(){ cout<<"destructor : derived"<<endl;}  }; void foo() {     base & var = derived();     base*pvar = new derived;     delete pvar; } void main() {     foo();         std::cin.get(); }   out put: constructor: base constructor: derived constructor: base constructor: derived destructor : base // derived not called,                   // pval of type base* , fn not virtual                    //so compile time binding destructor : derived destructor : base      
if the method not virtual, both calls resolved @ compile time. if method virtual first call in question (obj.method()) resolved @ compile time object, @ runtime reference. second call (objp->method()) resolved @ runtime. can force @ compile time call non-derived version of method.
struct base {    void f();    virtual void v(); }; struct derived : public base {    void f();    void v(); // intentionally left virtual out, not matter }; int main() {    derived d;    base & b = d;    base * bp = &d;     // compile time:    d.f();   // derived::f    d.v();   // derived::v    b.f();   // base::f   -- non-virtual    bp->f(); // base::f   -- non-virtual     // runtime:    b.v();   // derived::v    bp->v(); // derived::v     // compile time (user forced):    b.base::v();   // base::v    bp->base::v(); // base::v }      
Comments
Post a Comment