我有這樣的代碼:虛擬關鍵字使得人跡罕至的方法從派生的對象
#include <iostream>
class Super{
public:
virtual void showName();
};
class Special1 : public Super {
public:
void showName();
void sayHello();
};
class Special2 : public Super {
public:
void showName();
void sayGoodbye();
};
void Super::showName() {
std::cout << "I'm super!" << std::endl;
}
void Special1::showName() {
std::cout << "I'm special1" << std::endl;
}
void Special1::sayHello() {
std::cout << "Hello" << std::endl;
}
void Special2::showName() {
std::cout << "I'm special2" << std::endl;
}
void Special2::sayGoodbye() {
std::cout << "Goodbye" << std::endl;
}
int main() {
Super *oSpec=new Super;
Special1 *o1=static_cast<Special1 *>(oSpec);
Special2 *o2=static_cast<Special2 *>(oSpec);
oSpec->showName();
o1->showName();
o2->showName();
o1->sayHello();
o2->sayGoodbye();
delete oSpec;
return 0;
}
當我運行它,它顯示了這個輸出:
I'm super!
I'm super!
I'm super!
Hello
Goodbye
但是,如果我刪除virtual
關鍵字來自Super
類的聲明:
class Super{
public:
/*virtual*/ void showName();
};
輸出成爲正確之一:
I'm super!
I'm special1
I'm special2
Hello
Goodbye
然後,我的問題是,爲什麼virtual
關鍵字的存在使得指針o1
和o2
運行的方法Super::showName()
,而不是Special1::showName()
或Special2::showName()
?
使用上面的static_cast <>是未定義的行爲。該代碼已損壞,僅適用於編譯器及其當前標誌的奇想。 –
代碼會導致未定義的行爲,除非指向的對象實際上是一個「Special#」實例,否則不能將'Super *'強制轉換爲'Special#*'對象,而在您的情況下則不是。 –