假设我有一些类 foo,它有一个指向另一个类 Bar 的指针向量和一个记录每个 Bar 的内部类型的 LogBarVec() 方法:
class Foo {
std::vector<std::unique_ptr<Bar>> m_BarVec;
void LogBarVec() const {
for(auto& b : m_BarVec) {
b->Log();
}
}
}
Bar 是具有纯虚拟 Log 方法的基本类型:
class Bar {
public:
Bar(){};
virtual void Log() const = 0;
}
BarDerived 是从 Bar 派生的类:
class BarDerived : public Bar {
int number = 0;
public:
BarDerived(float num) : Bar(), number(num){};
void Log() const override {
std::cout << "BarDerived number: " << number << std::endl;
}
}
我的问题是,从 Foo 访问 Bars 内部类型的 Log 方法的正确方法是什么?换句话说?
首先,由于Bar是BarDerived的基类,为了避免切片,你应该声明一个std::unique_ptr
使用指向 Bar 的指针,您将能够插入任何 Bar 的派生类。 即使您已声明为基类,由于它是指向其派生类的指针,因此将调用重写的方法。