[英]Virtual Functions in Derived Classes
看了幾個視頻,才知道虛擬function調用是如何通過后期綁定處理的。
在早期綁定中,對於像ptr->func(...)
這樣的行,編譯器檢查ptr
的數據類型並在相應的 class 中查找func(...)
定義。
而虛函數后期綁定時,會訪問ptr
地址,然后在對應的class中查找定義。
如果我對剛才提到的機制是正確的,那么為什么下面的代碼會產生錯誤?
class A{
public:
void func(){
}
};
class B: public A{
public:
virtual void f4(){
cout<<"Cunt"<<endl;
}
};
int main(){
A* ptr;
B obj;
ptr=&obj;
ptr->f4();
return 0;
}
另外,為什么下面的代碼會生成 output base
而不是 output derived
的?
class A{
public:
void f4(){
cout<<"base"<<endl;
}
};
class B: public A{
public:
virtual void f4(){
cout<<"derived"<<endl;
}
};
int main(){
A* ptr;
B obj;
ptr=&obj;
ptr->f4();
return 0;
}
請幫忙。 我對機制有誤嗎?
在 class A
中, function f4
也應定義為virtual
:
class A {
public:
virtual void f4(){
std::cout << "base" << std::endl;
}
};
在您的情況下,由於非虛擬 inheritance, f4
是非虛擬 function。
還有一件事,派生的虛函數應該標記為override
,而virtual
不是必需的:
class B : public A {
public:
void f4() override {
std::cout << "derived" << std::endl;
}
};
如果您嘗試將B
中的f4
標記為override
而不首先在A
中使其成為virtual
,您將收到編譯錯誤: error: 'virtual void B::f4()' marked 'override', but does not override
- 這意味着您將無法A
class 指針訪問它。
旁注:閱讀以下帖子: 為什么“使用命名空間標准;” 被認為是不好的做法?
在您的第一個示例中, A
沒有名為f4()
的方法,因此對ptr->f4()
的調用無效。
在您的第二個示例中, A::f4()
未標記為virtual
,因此對ptr->f4()
的調用不執行虛擬調度,因此調用A::f4()
而不是B::f4()
.
這兩個問題的解決方案是相同的 - 使f4()
在A
中是虛擬的,並讓B
override
它,例如:
class A{
public:
virtual void f4() {
cout << "base" << endl;
}
};
class B: public A{
public:
void f4() override {
cout << "derived" << endl;
}
};
int main(){
A* ptr;
B obj;
ptr = &obj;
ptr->f4();
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.