C++ 如何创建指向C+中编译时类型未知的派生类的新指针+;?

C++ 如何创建指向C+中编译时类型未知的派生类的新指针+;?,c++,pointers,polymorphism,derived-class,C++,Pointers,Polymorphism,Derived Class,我有一个代码,其中有一些指向相同基类的派生类的指针。有一次我需要创建另一个指向这个派生类的指针,但我不知道在编译时它将指向哪个类。 下面是代码示例: #include <iostream> using namespace std; class Polygon { protected: int width, height; public: void set_values (int a, int b) { width=a; height=b; };

我有一个代码,其中有一些指向相同基类的派生类的指针。有一次我需要创建另一个指向这个派生类的指针,但我不知道在编译时它将指向哪个类。 下面是代码示例:

#include <iostream>
using namespace std;

class Polygon {
  protected:
    int width, height;
  public:
    void set_values (int a, int b)
      { width=a; height=b; };
    virtual int area() = 0;
};

class Rectangle: public Polygon {
  public:
    int area()
      { return width*height; }
};

class Triangle: public Polygon {
  public:
    int area()
      { return width*height/2; }
};

int main () {
  Rectangle* rect = new Rectangle;
  Triangle* trgl = new Triangle;
  Polygon* ppoly;
  trgl->set_values (4,5);
  ppoly = trgl;
  cout << ppoly->area() << '\n';
  trgl->set_values (8,5);
  cout << ppoly->area() << '\n';
  return 0;
}
#包括
使用名称空间std;
类多边形{
受保护的:
int宽度、高度;
公众:
无效集合_值(整数a、整数b)
{宽度=a;高度=b;};
虚拟整数区域()=0;
};
类矩形:公共多边形{
公众:
内部区域()
{返回宽度*高度;}
};
类三角形:公共多边形{
公众:
内部区域()
{返回宽度*高度/2;}
};
int main(){
矩形*rect=新矩形;
三角形*trgl=新三角形;
多边形*ppoly;
trgl->设置_值(4,5);
ppoly=trgl;
cout area()设置_值(8,5);

cout area()您需要的是一个
clone()
函数。

显然,除了与基类相关的构造,您不能实例化派生类。但是基类指针后面仍然有一个派生类实例,它可以封装构造另一个实例的“能力”

这个习惯用法被称为a-,它甚至不难实现。简而言之,您将有一个非静态虚拟方法,它在堆上构造一个新实例,并且可以从基类中使用。它看起来类似于:

Polygon* poly = get_a_poly_which_really_is_some_derived_class();
Polygon* another_poly = poly->create();
注:

  • 我只是注意到这基本上是一个克隆,并且有类似的答案
  • 除非你真的需要,否则我不建议你这么做。我想可能有一个更好的选择来代替虚拟构建对象
  • 使用或,而不是使用原始指针