第47课 C++中的父子冲突

    科技2024-10-05  22

    问题引出:子类中是否可以定义父类中的成员,如果可以怎么区分?如果不可以,为什么?

    47-1.cpp

    #include <iostream> using namespace std; class Parent { public: int mi; Parent() { cout << "Parent()"<<"&mi = " << &mi << endl; } }; class Child :public Parent { public: int mi; Child() { cout <<"Child()"<< "&mi = " << &mi << endl; } }; int main() { Child c; c.mi = 100; c.Parent::mi = 1000; cout << "&c.m = " <<&c.mi<< endl; cout << "&c.Parent::mi = "<<&c.Parent::mi << endl; return 0; }

    结果: 从结果中我们可以看出,子类可以定义父类中的同名成员。子类中的成员将隐藏父类中的同名成员,父类中的同名成员依然存在于子类中,通过作用域分辨符(::)可以访问父类中的同名成员

    子类中定义的函数是否能重载父类中的同名函数

    47-2.cpp

    #include <iostream> using namespace std; class Parent { public: int mi; void add(int v) { mi += v; } void add(int a, int b) { mi += (a + b); } }; class Child :public Parent { public: int mi; void add(int a, int b,int c) { mi += (a + b + c); } }; int main() { Child c; c.mi = 100; c.Parent::mi = 1000; cout << "c.mi = " <<c.mi<< endl; cout << "c.Parent::mi = "<<c.Parent::mi << endl; c.add(1); c.add(100, 200); cout << "c.mi = " << c.mi << endl; cout << "c.Parent::mi = " << c.Parent::mi << endl; return 0; }

    结果:直接保红,说明子类中不能重载父类的同名函数 原因:子类中覆盖父类中所有的add函数,导致产生错误 解决:使用作用域分辨符访问父类中的同名函数

    小结

    Processed: 0.013, SQL: 8