Consider the following hierarchy of structs:
struct I1 {
virtual void doit() = 0;
};
struct I2 {
virtual void doit(int) = 0;
};
struct I12 : I1, I2 {
using I1::doit;
using I2::doit;
};
struct Derived : I12 {
void doit(int) override {}
};
Compiling this (using clang
, or g++
with -Woverloaded-virtual
) gives me a warning:
'Derived::doit' hides overloaded virtual function [-Woverloaded-virtual]
However, if I change I12
to the following, it compiles fine under clang
, while g++ -Woverloaded-virtual
still gives a warning:
struct I12 : I1, I2 {
using I1::doit;
void doit(int) override = 0;
};
Where is the difference between using I2::doit
and void doit(int) override = 0
? Naively, I would have thought that the former is sufficient to inform the compiler that I am aware that there are two versions of doit
.
It is not possible for these functions to get overloaded.
A virtual function can be private as C++ has access control, but not visibility control. As mentioned virtual functions can be overridden by the derived class but under all circumstances will only be called within the base class.
A private virtual function can be overridden by derived classes, but can only be called from within the base class. This is actually a useful construct when you want that effect.
¶ Δ A pure virtual function is a function that must be overridden in a derived class and need not be defined. A virtual function is declared to be “pure” using the curious =0 syntax.
It complains that doit
is hidden in Derived
. A fix:
struct Derived : I12 {
using I12::doit; // Bring all doit declarations from I12 into this scope.
void doit(int) override {}
};
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