The title is probably confusing.
Suppose we have the following set up;
class A
{
public:
virtual void fn() = 0;
};
class B
{
public:
virtual int fn() {};
};
class C: public A, public B
{
};
Is there any way to define A::fn
in class C
?
It is not possible for these functions to get overloaded.
In C++, function overloading is possible i.e., two or more functions from the same class can have the same name but different parameters. However, if a derived class redefines the base class member method then all the base class methods with the same name become hidden in the derived class.
A virtual function can be a friend function of another class. Virtual functions should be accessed using pointer or reference of base class type to achieve runtime polymorphism. The prototype of virtual functions should be the same in the base as well as derived class.
The virtual keyword can be used when declaring overriding functions in a derived class, but it is unnecessary; overrides of virtual functions are always virtual. Virtual functions in a base class must be defined unless they are declared using the pure-specifier.
There's no way in C
to specify that one of the C::fn()
implementations overloads A::fn()
(and presumably another overloads
B::fn()
). What you can do, however, is introduce an intermediate
class which “renames” the functions, something like:
class RemapA : public A
{
virtual void fnInA() = 0;
public:
virtual void fn()
{
fnInA();
}
};
class RemapB : public B
{
virtual int fnInB() = 0;
public:
virtual int fn()
{
return fnInB();
}
};
class C : public RemapA, public RemapB
{
virtual void fnInA() { /* ... */ }
virtual void fnInB() { /* ... */ }
// ...
};
No. This is not possible. It will always conflict with either of the fn()
.
The syntax of fn()
are different,
void fn(); // in A
and in B
is,
int fn(); // in B
You have to make those syntax same in A
and B
to let C
implement the fn()
. Demo.
You might want to read my answer to the following question: Implement two functions with the same name but different, non-covariant return types due to multiple abstract base classes In short: Yes, with some restrictions on calling it. It can be called as an A (pointer or reference) or a B (pointer or reference), but not as a C, as that would be ambiguous.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With