c++ - 理解 C++ 中的多态性

标签 c++ polymorphism

我试图通过这个简单的例子来理解 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 位)编译的。

  1. 是否赋值:

    PolyMorphVector[i]=new Derived;
    

    被视为良好做法?

  2. 为什么我必须显式地 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/

相关文章:

c++ - DirectX 11 制作一个正方形。

c++ - 在 C++ 中寻找吃得最少的人

c++ - 如何使用 OpenSSL 进行 AES 解密

ruby-on-rails - 如何从字符串中获取模型类?

c++ - 派生的、具体的、类的虚表

c++ - 如何清除 vector 但保持其容量?

c++ - 有符号的十六进制文字可能吗?

.net - 显式类型成员约束中的 "or"

java - equals 方法重载时的行为如何?

c++ - 在派生类构造函数中使用智能指针