java中所有函数都是虚函数_关于Java:虚拟函数与纯虚函数之间的区别是什么?...
本問題已經(jīng)有最佳答案,請猛點(diǎn)這里訪問。
Possible Duplicate:
C++ Virtual/Pure Virtual Explained
虛函數(shù)和純虛函數(shù)有什么區(qū)別?
CPP中的純虛函數(shù)與Java中的抽象方法是一樣的。
stackoverflow.com/questions/1306778/…副本
可以在派生類中重寫虛函數(shù)。純虛函數(shù)必須在派生類中重寫。具體來說,除非至少有一個派生類重寫了該虛函數(shù),否則不能用純虛函數(shù)實例化類。
維基百科:
A pure virtual function or pure virtual method is a virtual function that is required to be implemented by a derived class that is not abstract. Classes containing pure virtual methods are termed"abstract;" they cannot be instantiated directly, and a subclass of an abstract class can only be instantiated directly if all inherited pure virtual methods have been implemented by that class or a parent class. Pure virtual methods typically have a declaration (signature) and no definition (implementation).
那么,在Java術(shù)語中,這是否意味著一個虛擬函數(shù)是簡單的"(實例)方法",一個純粹的虛擬是"抽象方法"?
@是的,但是需要在派生類中實現(xiàn)該方法。這是"純虛擬"和"虛擬"的區(qū)別
是的,Java中的所有方法都是虛擬的(除了那些標(biāo)記為EDCOX1,0,顯然),所以在討論Java時,這個術(shù)語有點(diǎn)多余。然而,在C++和C語言等語言中,它不是冗余的,默認(rèn)情況下方法不是虛擬的。
純虛函數(shù)是一個必須由派生類重新定義的虛函數(shù),因此通常在基類中沒有實現(xiàn)(盡管可以提供它,但派生類通過作用域解析運(yùn)算符調(diào)用它;感謝@mark ransom和@toolbox指出它)。
如果一個類有純虛方法,它就不能被實例化,因此從抽象類(即具有純虛方法的類)派生的任何類都必須定義這種方法才能被實例化。
例子:
#include
using std::cout;
using std::endl;
class BaseClass
{
public:
// A"normal" virtual function which provides a default implementation
virtual void OnlyVirtual()
{
cout<
}
// A"normal" pure virtual function: must be redefined, no default
// implementation
virtual void PureVirtual()=0;
// A pure virtual function that provides a default implementation that can
// be called only explicitly via scope-resolution operator
virtual void PureVirtualWImpl()=0;
};
void BaseClass::PureVirtualWImpl()
{
cout<
}
class Derived0 : public BaseClass
{
public:
// Define the pure virtual function
virtual void PureVirtual()
{
cout<
}
// notice that, even if there's an implementation of PureVirtualWImpl in
// BaseClass, since it's marked as pure, Derived0 cannot still be
// instantiated
};
class Derived1 : public Derived0
{
public:
// PureVirtual is already defined by the parent class Derived0
// I must define also PureVirtualWImpl if I want to instantiate this class
virtual void PureVirtualWImpl()
{
cout<
}
};
class Derived2 : public Derived1
{
public:
// Obviously I can redefine the"normal" virtual function
virtual void OnlyVirtual()
{
cout<
}
// Redefine PureVirtual
virtual void PureVirtual()
{
cout<
}
// Just for fun I can redefine PureVirtualWImpl to call the base normally-
// unaccessible implementation
virtual void PureVirtualWImpl()
{
BaseClass::PureVirtualWImpl();
}
};
void TestClass(BaseClass & C)
{
C.OnlyVirtual();
C.PureVirtual();
C.PureVirtualWImpl();
}
int main()
{
// BaseClass b; //
// Derived0 d0; //
Derived1 d1;
Derived2 d2;
TestClass(d1);
TestClass(d2);
}
輸出:
BaseClass::OnlyVirtual
Derived0::PureVirtual
Derived1::PureVirtualWImpl
Derived2::OnlyVirtual
Derived2::PureVirtual
BaseClass::PureVirtualWImpl
實際上,可以在基類中提供純虛擬函數(shù)的實現(xiàn)。派生類被強(qiáng)制重寫它,但它仍然可以使用范圍運(yùn)算符調(diào)用。
這不一定是真的。如果需要,您可以為純虛擬函數(shù)提供實現(xiàn),這在實踐中并不常見。如果您希望在派生版本中使用實現(xiàn)細(xì)節(jié),但仍然希望強(qiáng)制所有派生類提供實現(xiàn),那么這種情況可能很有用。
@toolbox@markransom如果永遠(yuǎn)都不使用純虛擬函數(shù)的基本實現(xiàn),那么為什么還要使用它呢?
@雅各布:以東十一〔一〕號
@馬克·蘭索姆:修好了,謝謝。
@藍(lán)調(diào)啊是的。
總結(jié)
以上是生活随笔為你收集整理的java中所有函数都是虚函数_关于Java:虚拟函数与纯虚函数之间的区别是什么?...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 紫菜葫芦藓水毛茛的细胞中含有的能量转换器
- 下一篇: 甜菜苗长什么样?