By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,171 Members | 992 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 446,171 IT Pros & Developers. It's quick & easy.

Problem with inheritance

P: n/a
Can someone tell me why the following code doesn't work:
TestClass.cpp
-------------
class A
{
public:
virtual void read(wchar_t& ch) { read(&ch, 0, 1); }
virtual void read(wchar_t* buf, int off, int len) = 0;
};

class B : public virtual A
{
public:
virtual void read(wchar_t* buf, int off, int len) {}
};

int main(int argc, char* argv[])
{
wchar_t ch;
B myclass;
myclass.read(ch);
}
I have tried both gcc 2.96 and gcc 3.2. I get:
TestClass.cpp: In function `int main(int, char**)':
TestClass.cpp:21: no matching function for call to `B::read(wchar_t&)'
TestClass.cpp:14: candidates are: virtual void B::read(wchar_t*, int, int)


Shouldn't B have inherited read(wchar_t& ch) from A?

Jul 19 '05 #1
Share this Question
Share on Google+
12 Replies


P: n/a

"Victor Chew" <vc***@post1.com> wrote in message
news:bg**********@mawar.singnet.com.sg...
Can someone tell me why the following code doesn't work:
> TestClass.cpp
> -------------
class A
{
public:
virtual void read(wchar_t& ch) { read(&ch, 0, 1); }
virtual void read(wchar_t* buf, int off, int len) = 0;
};

class B : public virtual A
{
public:
virtual void read(wchar_t* buf, int off, int len) {}
};

int main(int argc, char* argv[])
{
wchar_t ch;
B myclass;
myclass.read(ch);
}
I have tried both gcc 2.96 and gcc 3.2. I get:
TestClass.cpp: In function `int main(int, char**)':
TestClass.cpp:21: no matching function for call to `B::read(wchar_t&)'
TestClass.cpp:14: candidates are: virtual void B::read(wchar_t*, int,

int)
Shouldn't B have inherited read(wchar_t& ch) from A?


Your base class function virtual void read(wchar_t& ch) has been hidden by
the derived class
function virtual void read(wchar_t* buf, int off, int len).
Jul 19 '05 #2

P: n/a
"Victor Chew" <vc***@post1.com> wrote in message
news:bg**********@mawar.singnet.com.sg...
Can someone tell me why the following code doesn't work:
> TestClass.cpp
> -------------
class A
{
public:
virtual void read(wchar_t& ch) { read(&ch, 0, 1); }
virtual void read(wchar_t* buf, int off, int len) = 0;
};

class B : public virtual A
{
public:
virtual void read(wchar_t* buf, int off, int len) {}
};

int main(int argc, char* argv[])
{
wchar_t ch;
B myclass;
myclass.read(ch);
}


I have tried both gcc 2.96 and gcc 3.2. I get:
TestClass.cpp: In function `int main(int, char**)':
TestClass.cpp:21: no matching function for call to `B::read(wchar_t&)'
TestClass.cpp:14: candidates are: virtual void B::read(wchar_t*, int, int)


Shouldn't B have inherited read(wchar_t& ch) from A?


B::read(wchar_t* buf, int off, int len) hides A::read(wchar_t& ch).
If you override an overloaded base class functions,
redefine full set of the functions.

--
ES Kim
Jul 19 '05 #3

P: n/a
On Thu, 31 Jul 2003 11:42:17 +0800, Victor Chew <vc***@post1.com> wrote:
Can someone tell me why the following code doesn't work:
TestClass.cpp
-------------
class A
{
public:
virtual void read(wchar_t& ch) { read(&ch, 0, 1); }
virtual void read(wchar_t* buf, int off, int len) = 0;
};

class B : public virtual A
{
public:
using A::read;
virtual void read(wchar_t* buf, int off, int len) {}
};

int main(int argc, char* argv[])
{
wchar_t ch;
B myclass;
myclass.read(ch);
}


I have tried both gcc 2.96 and gcc 3.2. I get:
TestClass.cpp: In function `int main(int, char**)':
TestClass.cpp:21: no matching function for call to `B::read(wchar_t&)'
TestClass.cpp:14: candidates are: virtual void B::read(wchar_t*, int, int)


Shouldn't B have inherited read(wchar_t& ch) from A?


It has, but without the 'using' it's hidden by the other read.
Now don't ask me _why_ someone thought that would be sensible.

Jul 19 '05 #4

P: n/a
I don't get it. Isn't overriding based on method signatures? There is
clearly a difference between read(wchar_t&) and read(wchar_t*, int,
int)! Why can't I selectively override one of the methods from the base
class? What is the workaround?

Alf P. Steinbach wrote:
On Thu, 31 Jul 2003 11:42:17 +0800, Victor Chew <vc***@post1.com> wrote:

Can someone tell me why the following code doesn't work:

TestClass.cpp
-------------
class A
{
public:
virtual void read(wchar_t& ch) { read(&ch, 0, 1); }
virtual void read(wchar_t* buf, int off, int len) = 0;
};

class B : public virtual A
{
public:

using A::read;

virtual void read(wchar_t* buf, int off, int len) {}
};

int main(int argc, char* argv[])
{
wchar_t ch;
B myclass;
myclass.read(ch);
}


I have tried both gcc 2.96 and gcc 3.2. I get:

TestClass.cpp: In function `int main(int, char**)':
TestClass.cpp:21: no matching function for call to `B::read(wchar_t&)'
TestClass.cpp:14: candidates are: virtual void B::read(wchar_t*, int, int)


Shouldn't B have inherited read(wchar_t& ch) from A?

It has, but without the 'using' it's hidden by the other read.
Now don't ask me _why_ someone thought that would be sensible.


Jul 19 '05 #5

P: n/a
ES Kim wrote:


B::read(wchar_t* buf, int off, int len) hides A::read(wchar_t& ch).
If you override an overloaded base class functions,
redefine full set of the functions.


There is no overriding in this case. Also, redefining the entire set of
functions would be a pointless waste of time. A using declaration brings
the base class's overloads into scope nicely.

-Kevin

Jul 19 '05 #6

P: n/a
Do you mind posting a short code segment showing me how to do this?

Thanks!

Kevin Goodsell wrote:
ES Kim wrote:


B::read(wchar_t* buf, int off, int len) hides A::read(wchar_t& ch).
If you override an overloaded base class functions,
redefine full set of the functions.


There is no overriding in this case. Also, redefining the entire set of
functions would be a pointless waste of time. A using declaration brings
the base class's overloads into scope nicely.

-Kevin


Jul 19 '05 #7

P: n/a

"Victor Chew" <vc***@post1.com> wrote in message
news:bg**********@mawar.singnet.com.sg...
Do you mind posting a short code segment showing me how to do this?

Thanks!


class B : public virtual A
{
public:
virtual void read(wchar_t& ch) { A::read(ch); }
virtual void read(wchar_t* buf, int off, int len) {}
};

john
Jul 19 '05 #8

P: n/a
Hello,

You can use polymorphism in order to have the workaround solution.
Even though I wouldn't call it workaround, anyway...

A* myclass = new B;
myclass.read(ch);

Then everything will work properly, since late binding will take part, and
it will resolve the correct functions.


"Victor Chew" <vc***@post1.com> wrote in message
news:bg**********@mawar.singnet.com.sg...
I don't get it. Isn't overriding based on method signatures? There is
clearly a difference between read(wchar_t&) and read(wchar_t*, int,
int)! Why can't I selectively override one of the methods from the base
class? What is the workaround?

Alf P. Steinbach wrote:
On Thu, 31 Jul 2003 11:42:17 +0800, Victor Chew <vc***@post1.com> wrote:

Can someone tell me why the following code doesn't work:
TestClass.cpp
-------------
class A
{
public:
virtual void read(wchar_t& ch) { read(&ch, 0, 1); }
virtual void read(wchar_t* buf, int off, int len) = 0;
};

class B : public virtual A
{
public:

using A::read;

virtual void read(wchar_t* buf, int off, int len) {}
};

int main(int argc, char* argv[])
{
wchar_t ch;
B myclass;
myclass.read(ch);
}

I have tried both gcc 2.96 and gcc 3.2. I get:
TestClass.cpp: In function `int main(int, char**)':
TestClass.cpp:21: no matching function for call to `B::read(wchar_t&)'
TestClass.cpp:14: candidates are: virtual void B::read(wchar_t*, int, int)
Shouldn't B have inherited read(wchar_t& ch) from A?

It has, but without the 'using' it's hidden by the other read.
Now don't ask me _why_ someone thought that would be sensible.

Jul 19 '05 #9

P: n/a
Victor Chew wrote:
Do you mind posting a short code segment showing me how to do this?

Thanks!


Please do not top-post. Re-read section 5 of the FAQ for posting
guidelines: http://www.parashift.com/c++-faq-lite/how-to-post.html

See Alf's reply for the example you requested.

-Kevin

Jul 19 '05 #10

P: n/a
"Victor Chew" <vc***@post1.com> wrote in message
news:bg**********@mawar.singnet.com.sg...
I don't get it. Isn't overriding based on method signatures? There is
clearly a difference between read(wchar_t&) and read(wchar_t*, int,
int)!


Please read all replies, such as my other one, if you see it there. It has a
link to a thread that explains the rule and why.

DW

Jul 19 '05 #11

P: n/a
On Thu, 31 Jul 2003 13:45:46 +0800, Victor Chew <vc***@post1.com> wrote:
I don't get it. Isn't overriding based on method signatures? There is
clearly a difference between read(wchar_t&) and read(wchar_t*, int,
int)! Why can't I selectively override one of the methods from the base
class?
You can, and you just did.

It is just as static type B that one 'read' method is hidden. The other
is still there. E.g., you can cast it to A& and access the other 'read'.

David White here provided a URL to an earlier discussion where Russel
Hanneken provided a URL to an even earlier discussion where Chris Newton
tried to explain the original thinking, see [http://tinyurl.com/hlts].

What is the workaround?


'using', as shown in my first reply.

Jul 19 '05 #12

P: n/a
Thanks for all your replies. I support Chris' comment that "I personally
regard this decision as unfortunate". If there is a perfect method
signature match in the base class which is not overridden in the
subclass, then it should simply be used. It's the principle of least
surprise.

Alf P. Steinbach wrote:
On Thu, 31 Jul 2003 13:45:46 +0800, Victor Chew <vc***@post1.com> wrote:

I don't get it. Isn't overriding based on method signatures? There is
clearly a difference between read(wchar_t&) and read(wchar_t*, int,
int)! Why can't I selectively override one of the methods from the base
class?

You can, and you just did.

It is just as static type B that one 'read' method is hidden. The other
is still there. E.g., you can cast it to A& and access the other 'read'.

David White here provided a URL to an earlier discussion where Russel
Hanneken provided a URL to an even earlier discussion where Chris Newton
tried to explain the original thinking, see [http://tinyurl.com/hlts].
What is the workaround?

'using', as shown in my first reply.


Jul 19 '05 #13

This discussion thread is closed

Replies have been disabled for this discussion.