Можно ли «наследовать» производную функцию от функции базового класса? - PullRequest
0 голосов
/ 10 ноября 2011

Во-первых, позвольте мне извиниться за название, я, честно говоря, не мог придумать, как это лучше выразить. Пример ниже должен прояснить мой вопрос:

class Foo    {
    public:
      Foo(int x);
    };

class Bar : public Foo
{
public:
  Bar(int y) : Foo(y);
};

Демонстрирует код, который заставит конструктор Bar вызывать конструктор Foo с параметром Y. Мой вопрос: существует ли аналогичный метод для наследования функции производного класса для вызова функции базового класса?

Например, все звонки на Bar.Func(); также автоматически вызывают Foo.Func();?

Ответы [ 4 ]

1 голос
/ 10 ноября 2011
class Foo    {
    public:
      Foo(int x);
  void DoIt();
    };

class Bar : public Foo
{
public:
  Bar(int y) : Foo(y);
  void DoIt();
};

void Bar::DoIt()
{
  Foo::DoIt();
}

Если Foo предназначен для получения и использования полиморфно, вы должны объявить DoIt как virtual. Кроме того, вам также потребуется деструктор virtual базового класса.

0 голосов
/ 10 ноября 2011

Это код, который вам понадобится, если вы хотите «наследовать» операторы функции для функции F () из ее базы. Объявите F () виртуальным в Foo, реализуйте там некоторые операторы. Затем объявите F () в Bar и сделайте вызов Foo :: F () в начале реализации Bar :: F ():

class Foo {
public:
  Foo(int i) { cout << "Foo(" << i << ") called." << endl; }
  virtual void F() { cout << "foo::F() called." << endl; }

  virtual ~Foo() {};
};

class Bar : public Foo {
public:
  Bar(int i) : Foo(i) { cout << "Bar(" << i << ") called" << endl; }
  void F()  { Foo::F(); cout << "bar::F() called" << endl; }
};

int main(int argc, char** argv) {
  Bar b(3);
  b.F();
}

дает

Foo (3) вызвал.
Бар (3) называется
Вызван foo :: F ().
bar :: F () называется

0 голосов
/ 10 ноября 2011

автоматически, нет. Вы можете использовать Base::member() для его вызова.

struct foo {
    void frob() { std::cout << "foo::frob" << std::endl; }
};

struct bar : foo {
    void frob() { foo::frob(); std::cout << "bar::frob" << std::endl; }
};
0 голосов
/ 10 ноября 2011

Любая открытая функция, объявленная в Foo, также доступна через Bar (та же функция будет вызываться).Если вам может потребоваться переопределить функцию в Bar, чтобы изменить ее поведение, сделайте ее virtual.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...