【发布时间】:2015-11-10 18:55:49
【问题描述】:
我正在尝试使用这个简单的示例来理解 C++ 中的多态机制(为清楚起见,构造函数在 hpp 文件中显式编写,公共成员也是如此)
基类:
//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 OS(64 位)编译的。
-
作业是:
PolyMorphVector[i]=new Derived;被认为是好的做法?
虽然我为 PolyMorphVector 的每个元素分配了 Derived 类,但为什么我必须显式进行动态转换?
【问题讨论】:
-
getDerivedVar 未在基类中声明。要成为多态方法,应在 Base 类中将方法声明为 virtual
-
哦,回到我第一次学习的那些日子,我会感到非常沮丧,我的大脑会完全停止工作。
-
想一想……这仍然会发生:p
-
多态(C++ 面向对象的种类,还有其他种类)是通过基类指针或引用在派生对象中调用虚函数。不多也不少。
dynamic_cast<Derived*>(pBase)几乎与多态性相反。
标签: c++ polymorphism