You don't need to redeclare them in most cases. See the following:
Code:
#include <iostream>
struct base
{
virtual void foo()
{ std::cout << "base" << std::endl; }
};
struct derived1 final : base
{ }; // derived1 is-a base, so foo() is available
struct derived2 final : base
{
/* can be used to assign a new protection level of base members
(from protected -> public, for example) or explicitly forward */
using base::foo;
};
struct derived3 final : base
{
/* override added in C++11 but not required for this to work */
void foo() override
{ std::cout << "derived3" << std::endl; }
};
int main()
{
derived1 d1;
d1.foo();
derived2 d2;
d2.foo();
derived3 d3;
d3.foo();
}