Переопределение в C ++ - PullRequest
       26

Переопределение в C ++

0 голосов
/ 05 февраля 2010
class base {  
    public: 
        int foo();  
        int foo(int a);  
        int foo(char* b);    
        int doSomething(int);    
 }

 class derived : public base
  { 
  public: 
     int doSomething(int b); 
  }

 int derived::doSomething( int b) 
   {
     base::doSomething(b);  
       //Make Something else 
   }

 int main() 
 { 
     derived d= new derived();  
     d->foo();
 }

Теперь в методе foo (любом из них) я хочу вызвать более конкретную doSomething. если я создаю экземпляр производного класса, я хочу сделать doSomething производного класса, и если я создаю экземпляр базового класса, мне нужен doSomething базового класса, несмотря на то, что я вызываю метод foo, реализованный в базовом классе.

int base::foo()
{
 //do something
 makeSomething(5);
}

Ответы [ 3 ]

3 голосов
/ 05 февраля 2010

В вашем базовом классе сделайте метод doSomething виртуальным:

public:

virtual int doSomething(int);

Тогда вы можете:

Base* deriv = new Derived();

Base* base  = new Base();

deriv->doSomething();
base->doSomething();

И наслаждайтесь!

2 голосов
/ 05 февраля 2010

Вот для чего нужны виртуальные функции:

struct A {
    virtual ~A() {}
    virtual void f() {}
};

struct B : A {
    void f() {}
};

// ...
A* a = new A;
A* b = new B;
a->f(); // calls A::f
b->f(); // calls B::f

Lite C ++ FAQ охватывает некоторые детали , но не может заменить хорошую вводную книгу .

0 голосов
/ 14 ноября 2013

Я бы предложил этот пример, чтобы проиллюстрировать разницу между использованием виртуального или неиспользования

struct A {
    virtual ~A() {}
    virtual void f() {}
    void g() {}
};

struct B : A {
    void f() {}
    void g() {}
};

A* a = new A;
A* b = new B;
a->f(); // calls A::f
b->f(); // calls B::f
b->g(); // calls A::g
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...