header.hRisoluzione di funzione virtuale con parametri di default
#include <iostream>
using namespace std;
class A
{
public:
virtual void display(int i=5) { cout<< "Base::" << i << endl; }
};
class B : public A
{
public:
void display(int i=9) { cout<< "Derived::" << i << endl; }
};
source.h
#include <iostream>
#include "header.h"
using namespace std;
int main()
{
A * a = new B();
a->display();
A* aa = new A();
aa->display();
B* bb = new B();
bb->display();
}
uscita
Derived::5
Base::5
Derived::9
mia comprensione le funzioni dei parametri di default sono state risolte durante la compilazione utilizzando l'overloading delle funzioni. Le funzioni virtuali sono state quindi risolte durante il runtime mediante l'override della funzione.
Ma quello che sta succedendo è un casino.
Come si verifica effettivamente la risoluzione della funzione qui?
'risoluzione argomento predefinito si basa sul tipo statico dell'oggetto attraverso il quale si chiama il function' (cioè in base al tipo di puntatore). http://social.msdn.microsoft.com/Forums/en-US/90b9b8ee-ed5f-4ba8-93b5-612c4d906124/default-argument-and-inheritance-hierarchy –
Nota che puoi ovviare a questo problema sovraccaricando il virtuale funziona con un'altra funzione virtuale senza il parametro, che "inoltra" a quella con il parametro.Come: in Base 'virtual void display() {display (9); } 'e in Derived' void display() {display (5); } ' – leemes