我對 C 還很陌生,我試圖盡可能多地了解該語言和底層機制。
我對一個特定情況感到困惑,當我有兩個類(Base 和 Derived)時,我似乎無法訪問正確的成員函式,即使我將它們定義為虛擬。
class Base {
public:
virtual void print() { std::cout << "Base" << std::endl; };
};
class Derived : public Base {
public:
virtual void print() { std::cout << "Derived" << std::endl; };
};
int main() {
Base b;
Derived d;
b.print();
d.print();
Base* p1 = &b;
Base* p2 = &d;
p1->print();
p2->print();
std::vector<Base> v { b, d };
v[0].print();
v[1].print(); // Why doesn't this print "Derived?"
return 0;
}
輸出:
Base
Derived
Base
Derived
Base
Base <- ??
virtual似乎與型別的指標“作業” Base,但不適用于vector<Base>.
這是怎么回事?
uj5u.com熱心網友回復:
因為物件切片。創建矢量時,您將物件復制到其中。
std::vector<Base> v{ b, d };
問題是在里面std::vector你只有型別的物件Base,NOT Base和Derived。如果你想在 C 中使用容器的多型行為,你通常用指標來做,因為你不能在它們中保留原始參考。
std::vector<Base*> v{ &b, &d };
for (Base* ptr : v) {
ptr->print();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/340727.html
