Вызов базового метода от производного класса
Вопрос
У меня есть, например, такой класс:
class Base
{
public: void SomeFunc() { std::cout << "la-la-la\n"; }
};
Я получаю новый из него:
class Child : public Base
{
void SomeFunc()
{
// Call somehow code from base class
std::cout << "Hello from child\n";
}
};
И я хочу увидеть:
la-la-la
Hello from child
Могу ли я вызвать метод от производного класса?
Решение
Конечно:
void SomeFunc()
{
Base::SomeFunc();
std::cout << "Hello from child\n";
}
BTW с тех пор Base::SomeFunc()
не объявлен virtual
, Derived::SomeFunc()
скрывает это в базовом классе вместо переопределение Это, безусловно, собирается вызвать некоторые неприятные сюрпризы в долгосрочной перспективе. Так что вы можете изменить свою заявление на
public: virtual void SomeFunc() { ... }
Это автоматически составляет Derived::SomeFunc()
virtual
Также, хотя вы можете предпочесть явно объявлять его так, с целью ясности.
Другие советы
class Child : public Base
{
void SomeFunc()
{
// Call somehow code from base class
Base::SomeFunc();
std::cout << "Hello from child\n";
}
};
Кстати, вы можете сделать Derived::SomeFunc
public
слишком.
Вы делаете это, вызывая функцию снова префиксированной с именем класса родителей. Вы должны префикс названия класса, потому что там могут быть несколько родителей, которые предоставляют функцию имени какой-то. Если бы произошла бесплатная функция по имени quefuncunc, и вы хотели позвонить в этом вместо этого :: Womerfunc получит работу.
class Child : public Base
{
void SomeFunc()
{
Base::SomeFunc();
std::cout << "Hello from child\n";
}
};
Да, ты можешь. Обратите внимание, что вы дали методы одно и то же имя, не соответствующие их как virtual
И компилятор должен заметить это тоже.
class Child : public Base
{
void SomeFunc()
{
Base::SomeFunc();
std::cout << "Hello from child\n";
}
};