动态绑定和虚函数 - Vector of base class objects, access the "correct" member function
Dynamic binding and virtual functions - Vector of base class objects, access the "correct" member function
我是 c++ 的新手,我正在尝试尽可能多地了解该语言和底层机制。
我对一个特定情况感到困惑,当我有两个 类(基础和派生)时,我似乎无法访问正确的成员函数,即使我将它们定义为虚拟。
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>
.
中的对象
怎么回事?
因为对象切片。当您创建矢量时,您将对象复制到其中。
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();
}
我是 c++ 的新手,我正在尝试尽可能多地了解该语言和底层机制。
我对一个特定情况感到困惑,当我有两个 类(基础和派生)时,我似乎无法访问正确的成员函数,即使我将它们定义为虚拟。
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>
.
怎么回事?
因为对象切片。当您创建矢量时,您将对象复制到其中。
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();
}