父子间的同名成员变量:
子类成员将隐藏父类的成员,但是父类成员变量只是被隐藏,父类的同名函数依旧存在于子类中。
可以通过作用域分辨符( :: )访问父类的同名同名变量。
通过子类对象调用同名变量时,只会调用子类的成员变量。
#include <iostream> #include <string> using namespace std; class Parent { public: int value; }; class Child : public Parent { public: int value; }; int main() { Child c; c.value = 100; // 访问子类的value c.Parent::value = 100; // 通过父类名和作用域分辨符访问父类的value return 0; }
父子间的同名成员函数:
子类继承父类时同名函数不是函数重载,原因是作用域不同,只是函数同名覆盖。
父类的同名函数只是被隐藏,但依旧存在于子类中。
通过作用域分辨符( :: )访问父类同名函数。
通过子类对象调用同名成员函数时,只会调用子类的成员函数。
子类可以定义和父类中完全相同的同名函数。
#include <iostream> #include <string> using namespace std; class Parent { public: void add(int x) { std << "parent : add(int x) " << endl; } void add(int x, int y) { std << "parent : add(int x, int y) " << endl } }; class Child : public Parent { public: void add(int x) // 和父类中完全相同的函数,作用域不同,合法 { std << "Child : add(int x)" << endl; } void add(int x, int y) // 和父类中完全相同的函数,作用域不同,合法 { std << "Child : add(int x, int y)" << endl; } void add(int x, int y, int z) // 和父类中函数名相同的函数, 作用域不同,只是覆盖,不是重载 { std << "Child : add(int x, int y, int z)" << endl; } }; int main() { Child c; c.add(1); // Child : add(int x) c.add(1,1); // Child : add(int x, int y) c.add(1,1,1); // Child : add(int x, int y, int z) c.Parent::add(1); // parent : add(int x) c.Parent::add(1,1); // parent : add(int x, int y) return 0; }