I have written the following code to understand c++'s virtual, override, hide, overload meaning.
I expect fc->g()
give me output Child:g(int):i = 20
, but it gives me Child:g(int):i = 10
.
It seems the pointer fz call Child::g(int i) correctly by following links of vtbl(virtual table), but it fails to access the correct parameter value for int i
. I am really confused. Can anyone help?
#include <stdio.h>
#include <string>
#include <iostream>
#include <complex>
using namespace std;
class Father
{
public:
Father();
~Father();
// f(int) and f(double) are overload
virtual void f(int);
virtual void f(double);
virtual void g(int i = 10);
private:
};
void Father::f(int i)
{
cout << "Father:f(int)" << endl;
}
void Father::f(double i)
{
cout << "Father:f(double)" << endl;
}
void Father::g(int i)
{
cout << "Father:g(int):i = " << i << endl;
}
Father::Father()
{
cout << "new father" << endl;
}
Father::~Father()
{
cout << "delete father" << endl;
}
class Child : public Father
{
public:
Child();
~Child();
// using Father::f; // ucomment this to see the 'hide' effect
void f(complex<double> i); // this->f() hides function Father::f(int), Father::f(double)
virtual void g(int i = 20); // void g(int i = 20) override;
private:
};
void Child::f(complex<double> i)
{
cout << "Child:f(complex<double>)" << endl;
}
void Child::g(int i)
{
cout << "Child:g(int):i = " << i << endl;
}
Child::Child()
{
cout << "new Child" << endl;
}
Child::~Child()
{
cout << "delete Child" << endl;
}
int main()
{
Father father;
Child child;
Father *fc = new Child;
child.f(1); // hide father.f(int)
father.f(1);
child.f(0.1); // hide father.f(double)
father.f(0.1);
child.Father::f(1);
child.Father::f(0.1);
child.g(); // Child:g(int):i = 20, override father.g(int i=10)
child.Father::g(); // Father:g(int):i = 10
fc->g(); // Child:g(int):i = 10, why?
// this is not saft, some resources in child will not be released
// should declare virtual ~Father()
delete fc;
return 0;
}