2015-02-26 2 views
3

Как использовать конечную перегруженную функцию из производного класса?
Компилятор говорит: «Нет подходящей функции для вызова« B :: foo() ».Перегруженная конечная функция в производном классе

class A 
{ 
public: 
    virtual void foo() final 
    { 
     std::cout << "foo"; 
    } 
    virtual void foo(int b) = 0; 
}; 

class B : public A 
{ 
public: 
    void foo(int b) override 
    { 
     std::cout << b; 
    } 
}; 

//Somewhere 
B* b = new B; 
b->foo(); //Error 

Но он работает без перегрузки.

class A 
{ 
public: 
    virtual void foo() final 
    { 
     std::cout << "foo"; 
    } 
}; 

class B : public A 
{ 
}; 

//Somewhere 
B* b = new B; 
b->foo(); //Works! 

ответ

4

Эта декларация в классе B

void foo(int b) override 
{ 
    std::cout << b; 
} 

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

Вы можете вызвать функцию в явном виде, как этот

b->A::foo(); 

Или включают использование декларации

using A::foo; 

в определении класса В.

Или вы можете привести указатель к указатель базового класса

static_cast<A *>(b)->foo(); 
Смежные вопросы