基於我的研究,我認爲這有一個很好的感覺,但希望得到確認。我一直在學習繼承和虛擬方法的工作方式。繼承和虛擬方法
在底部的代碼中,運行main時會得到結果(上面的代碼)。如果我將printType方法切換爲非虛擬方式,則會打印出「AbstractClass」。
據我所知,使用「虛擬」表示該方法可能被覆蓋 - 並總是選擇該方法的「最後重新實現」,在這種情況下在ImplementationClass中。我的問題是:
1)這是否總是會發生?或者是否存在這樣的情況:即使它是一種虛擬方法,您可能最終會使用AbstractClass(或其他類,如果它被多次繼承)的方法被調用?
2)似乎你不能實例化一個包含虛擬方法的類的非指針。這是真的?
3)我假設在我的兩個例子中沒有什麼不同,但我只有約80%的可信度。
非常感謝您的幫助,這整個虛擬方法的東西很難從閱讀中找出來(這就是爲什麼我首先創建了一個虛擬項目!)。
after redefinition
ImplementationClass
printing from virtual method in ImplementationClass
second set of examples
ImplementationClass
printing from virtual method in ImplementationClass
#include <iostream>
using namespace std;
class AbstractClass{
public:
virtual void printStuff() = 0;
AbstractClass() {};
~AbstractClass() {};
virtual void printType() { std::cout << "AbstractClass" << std::endl; }
// void printType() { std::cout << "AbstractClass" << std::endl; }
};
class ImplementationClass : public AbstractClass {
public:
void printStuff() { std::cout << "printing from virtual method in ImplementationClass" << std::endl;}
void printType() { std::cout << "ImplementationClass" << std::endl; }
void printStuffOnlyInDerived() {std::cout << "printing from NONvirtual method in ImplementationClass" << std::endl;}
ImplementationClass() {};
~ImplementationClass() {};
};
int main() {
AbstractClass * absClass;
ImplementationClass * impClass= new ImplementationClass;
absClass = impClass;
printf("\nafter redefinition \n");
absClass->printType();
absClass->printStuff();
AbstractClass * absClassNonPtrImpClass = new ImplementationClass;
printf("\n second set of examples \n");
absClassNonPtrImpClass->printType();
absClassNonPtrImpClass->printStuff();
return 0;
}
不,它並不總是會發生。當在基類的構造函數中調用虛函數並且該函數尚未被覆蓋時,原函數將被調用。 –