通过子类对象调用父类有而子类没有的函数时,若该函数中调用了父类和子类共有的成员变量或成员非虚函数,则使用的是父类的,但是若在该函数中调用的是父类和子类共有的虚函数,则调用的是子类的虚函数,且上述均和加不加this指针没有关系。注意,此时我也没有用基类的指针指向子类对象,而是直接通过子类对象调用父类函数。
使用基类指针指向子类对象后,若用指针调用父类子类共有的成员变量或成员非虚函数,调用的是父类的。
子类对象初始化时,先调用基类的构造函数,此时子类还未出现,故调用虚函数时调用的是基类的。
#include <iostream>
using namespace std;
class father {
public:
int a = 0;
int b = 2;
father() {
cout << "construc father:" << endl;
mutual_func();
virtual_mutual1();
}
void father_func() {
cout << "father_func" << endl;
cout << a << endl;
cout << this->a << endl;
mutual_func();
this->mutual_func();
virtual_mutual1();
this->virtual_mutual1();
}
void mutual_func() {
cout << "father_mutual" << endl;
cout << this->a << endl;
}
virtual void virtual_mutual1() {
cout << "father_virtual_mutual1" << endl;
}
virtual void virtual_mutual2() {
cout << "father_virtual_mutual2" << endl;
}
};
class son : public father {
public:
int a = 1;
son() {
cout << "construc son:" << endl;
mutual_func();
virtual_mutual1();
}
void son_func() {
cout << "son_func" << endl;
cout << this->b << endl;
}
void mutual_func() {
cout << "son_mutual" << endl;
cout << this->a << endl;
}
virtual void virtual_mutual1() {
cout << "son_virtual_mutual1" << endl;
}
};
int main()
{
son s;
s.father_func();
father* p;
p = &s;
cout << "p: " << endl;
cout << p->a << endl;
p->mutual_func();
return 0;
}