在c++中,类与类之间有某些语义关系,这种关系是演化的结果,某些类的成员函数勇用于改善其特性,或者特化已有基类的某些特性,而对其余的特性加以继承。继承可以使基类的某些特性充分的得到可重用。但在某些时候处理不好的话,会带来一些编译错误。如下面的代码:
#include<iostream> using namespace std; class Base { public: virtual void fucA(void) = 0; virtual void fucA(int ); void fucB(); void fucC(); void fucC(double); }; void Base::fucA(int x) { cout << "Call function base A(int)" << endl; } void Base:: fucB() { cout << "Call function base B" << endl; } void Base::fucC() { cout << "Call function base C" << endl; } void Base::fucC(double x) { cout << "Call function base C(int)" << endl; } class Derive : public Base{ public: virtual void fucA(void); void fucB(); void fucC(); }; void Derive::fucA(void) { cout << "Call function derive A" << endl; } void Derive::fucB() { cout << "Call function derive B" << endl; } void Derive::fucC() { cout << "Call function derive C" << endl; } int main(void) { Derive derive; int x = 7; derive.fucB(); derive.fucA(); derive.fucA(x);//错误!Derive::fucA遮掩了Base::fucA derive.fucC(); derive.fucC(9.0);//错误!Derive::fucA遮掩了Base::fucA return 0; }
用gcc –c hhy.cc编译会产生如下错误:
Base class内作为名为fucA和fucC的函数都被derive class 内的fucA和fucC函数遮掩掉了。Base::fucA和Base::fucC不再被类Derive继承.这些行为背后的基本理由是为了防止你在程序库或应用框架内建立新的derived class时附带的从疏远的base class继承重载函数。如果你想使用base的函数可以通过using Base来实现:
#include<iostream> using namespace std; class Base { public: virtual void fucA(void) = 0; virtual void fucA(int ); void fucB(); void fucC(); void fucC(double); }; void Base::fucA(int x) { cout << "Call function base A(int)" << endl; } void Base:: fucB() { cout << "Call function base B" << endl; } void Base::fucC() { cout << "Call function base C" << endl; } void Base::fucC(double x) { cout << "Call function base C(int)" << endl; } class Derive : public Base{ public: using Base::fucA; using Base::fucC; virtual void fucA(void); void fucB(); void fucC(); }; void Derive::fucA(void) { cout << "Call function derive A" << endl; } void Derive::fucB() { cout << "Call function derive B" << endl; } void Derive::fucC() { cout << "Call function derive C" << endl; } int main(void) { Derive derive; int x = 7; derive.fucB(); derive.fucA(); derive.fucA(x); derive.fucC(); derive.fucC(9.0); return 0; }
这样就ok了。
现在越来越发现c++的强大了,对c++也是越来越感兴趣了。good good study, day day up!!!