2015-04-12 85 views
4

在下面的例子中,我有一個純虛擬方法(又名FUN1)和一個普通方法(又名FUN2)的抽象類。我可以重載基類中的純虛方法嗎?

#include <iostream> 

class A 
{ 
public: 
     virtual void fun(int i) = 0; // FUN1 
     void fun() { this->fun(123); } // FUN2 
}; 

class B : public A 
{ 
public: 
     virtual void fun(int i) { std::cerr << i << std::endl; } 
}; 

int main(int,char**) 
{ 
     B b; 
     b.fun(); 
} 

爲什麼我不能在派生類上調用FUN2?克++給出一個錯誤:

main.cpp:19:8: error: no matching function for call to ‘B::fun()’


編輯:注意,Overload of pure virtual function問題是不同的。我不想重寫方法。

+0

[純虛函數的重載]的可能重複(http://stackoverflow.com/questions/15827632/overload-of-pure-virtual-function) – Axalo

回答

6

這是派生類成員查找的工作原理:在表達b.fun()fun首先在class B範圍內擡頭,並查找發現B::fun(int) 。所以它停下來,從來沒有發現A::fun()。標準的

相關部分是10.2 [class.member.lookup]/4:

If C contains a declaration of the name f , the declaration set contains every declaration of f declared in C that satisfies the requirements of the language construct in which the lookup occurs. (...) If the resulting declaration set is not empty, the subobject set contains C itself, and calculation is complete.

爲了使基類功能直接訪問可以在派生類使用using聲明,即using A::fun;

對於在基類中實現的方法,替代方法有時有資格調用,即b.A::fun()

5

嘗試添加using A::fun;聲明B級:

#include <iostream> 

class A 
{ 
public: 
    virtual void fun(int i) = 0; // FUN1 
    void fun() { this->fun(123); } // FUN2 
}; 

class B : public A 
{ 
public: 
    using A::fun; 
    virtual void fun(int i) { std::cerr << i << std::endl; } 
}; 

int main(int, char**) 
{ 
    B b; 
    b.fun(); 
    b.fun(5); 
} 
+1

但爲什麼我需要它? – user2449761

+0

@ user2449761由於'fun()'沒有被聲明爲'virtual',所以它必須在派生類中顯式引入。 –

+0

或'b.A :: fun()'。 –

相關問題