Login | Register   
Twitter
RSS Feed
Download our iPhone app
TODAY'S HEADLINES  |   ARTICLE ARCHIVE  |   FORUMS  |   TIP BANK
Browse DevX
Sign up for e-mail newsletters from DevX


advertisement
 

Modify Your Base Class Interface in Derived Classes-3 : Page 3


advertisement
Name Injection
To fix this problem, you have to explicitly inject the name File::Open into the scope of NetworkFile::Open(). This way, any additional function called Open() that you declare in NetworkFile won't hide File::Open. To do so, use a using-declaration like this:

class NetworkFile : public DiskFile { public: using File::Open; //inject a name into current scope int Open(const wstring & path); //.. };

When you add a using-declaration of this kind, make sure that it appears in the public section of the class. Now you can use both overloaded versions of Open() in the derived class:

string path="\\usr\\image.bmp"; wstring wpath=L"\\usr\\image.bmp"; NetworkFile nf, nf2; nf.Open(path); //OK, File::Open(const string &) nf2.Open(wpath); //OK, NetworkFile::Open(const wstring &)

You may add as many overloaded versions of Open() as you like to NetworkFile:


class NetworkFile : public DiskFile { public: using File:Open; //inject name into current scope int Open(const wstring & path); int Open (const char * path); int Open (const wchar_t * path); //.. };

Likewise, any class that inherits from NetworkFile can use the same technique to add even more overloaded functions:

class UnixNetworkFile : public NetworkFile { public: using NetworkFile:Open; //inject all overloaded versions int Open(int descriptor); //.. }; UnixNetworkFile nf1, nf2, nf3; nf.Open(path); nf.Open(wpath); nf.Open(2); //opens stderr



Comment and Contribute

 

 

 

 

 


(Maximum characters: 1200). You have 1200 characters left.

 

 

Sitemap