我试图通过这个简单的例子来理解 C++ 中的多态性机制(为了清楚起见,构造函数明确地写在 hpp 文件中,公共(public)成员也是如此)
基类:
//Base.hpp
#ifndef _Base_H_
#define _Base_H_
class Base{
public:
int BaseVar;
Base():BaseVar(0){};
int getBaseVar(){return BaseVar;}
virtual int DoNothing(){return 0;};
};
#endif
派生类
//Derived.hpp
#include "Base.hpp"
#ifndef _Derived_H_
#define _Derived_H_
class Derived: public Base{
public:
int DerivedVar;
Derived():Base(),DerivedVar(0){};
int getDerivedVar(){return DerivedVar;}
};
#endif
多态类
//Polymorph.hpp
#include "Derived.hpp"
#include <vector>
using namespace std;
#ifndef _Polymorph_H_
#define _Polymorph_H_
class Polymorph{
public:
vector<Base *> PolyMorphVector;
Polymorph(int VectorSize):PolyMorphVector(VectorSize)
{
for (int i(0);i<VectorSize;i++)
PolyMorphVector[i]=new Derived;
}
};
#endif
主程序
//main.cpp
#include "Polymorph.hpp"
int main()
{
int i;
Polymorph *MyPolymorph = new Polymorph(10);
i=MyPolymorph->PolyMorphVector[0]->getDerivedVar();//copmiler error: "'getDerivedVar' : is not a member of 'Base'" ... Oh, really?
i=(dynamic_cast<Derived *>(MyPolymorph->PolyMorphVector[0]))->getDerivedVar();//OK!!
return 0;
}
一切都是在 VS 2010 中使用 Win7 操作系统(64 位)编译的。
是否赋值:
PolyMorphVector[i]=new Derived;
被视为良好做法?
为什么我必须显式地 dynamic_cast,虽然我用 Derived 类分配了 PolyMorphVector 的每个元素?
最佳答案
(1) 任务会起作用,但在任何地方都没有明确的所有权,你最好用类似的东西
std::vector<std::unique_ptr<Base>> poly_morph_vector;
然后初始化
for (auto& b : poly_morph_vector) {
b = std::make_unique<Derived>();
}
(2) Base
没有同名的成员函数,所以你会得到一个编译时错误。如果你想要动态调度,你需要类似的东西
class Base {
public:
virtual int get_var() const { return base_var; }
};
class Derived : public Base {
public:
int get_var() const override { return derived_var; }
};
那么你获取变量的代码就变成了
auto i = MyPolymorph->poly_morph_vector.front()->get_var();
关于c++ - 理解 C++ 中的多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33637425/