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