On 10 April 2013 20:29, Regan Heath <regan@netmail.co.nz> wrote:
Ok, lets Rewind for a sec.  I need some educating on the actual issue and I want to go through the problem one case at a time..


#1 If I write a class..

class A
{
  public int isVirt()  { return 1; }
  public int notVirt() { return 2; }
}

and compile it with another class..

class B : A
{
  override public int isVirt() { return 5; }
}

and this main..

void main()
{
  A a = new B();
  a.isVirt();    // compiler makes a virtual call
  a.notVirt();   // but not here
}

Right?


#2 But, if I do /not/ compile class B and have..

void main()
{
  A a = new A();
  a.isVirt();     // not a virtual call
  a.notVirt();    // neither is this
}

Right?


#3 If I put class A into a library (lib/dll) then compile/link it with..

class B : A
{
  override public int isVirt() { return 5; }
}

and..

void main()
{
  A a = new B();
  a.isVirt();    // compiler makes a virtual call
  a.notVirt();   // we're saying it has to make a virtual call here too
}

So, when the compiler produced the library it compiled all methods of A as virtual because it could not know if they were to be overridden in consumers of the library.

So, if the library created an A and passed it to you, all method calls would have to be virtual.

And, in your own code, if you derive B from A, then calls to A base class methods will be virtual.

Right?

R

All your examples all hinge on the one case where the optimisation may possibly be valid, a is _allocated in the same scope_. Consider:

void func(A* a)
{
 a.isVirt(); // is it? I guess...
 a.notVirt(); // what about this?
}

We don't even know what a B is, or whether it even exists.
All we know is that A's methods are virtual by default, and they could be overridden somewhere else. It's not possible to assume otherwise.