我正在阅读下面的代码。
class CPolygon {
protected:
int width, height;
public:
void set_values (int a, int b) { width=a; height=b; }
virtual int area () { return (0); }
};
class CRectangle: public CPolygon {
public:
int area () { return (width * height); }
};
class CTriangle: public CPolygon {
public:
int area () { return (width * height / 2); }
};
在使用此类之后,我们有一个代码,在此代码中, CRectangle 类的引用被分配给其父“ CPolygon ”,如下所示:
main () {
CRectangle rect;
CTriangle trgl;
CPolygon poly;
//*****This part is when a reference of the derived class is
//allocated to an instance of its parent class *****
CPolygon * ppoly = ▭
.
.
}
所以我的问题是,当我们这样做以及为什么这个代码行不是这样的:
CPolygon * ppoly = new rect;
由于
答案 0 :(得分:3)
示例中的代码生成一个指向已存在的变量rect
的指针。您可以创建一个指向该类型的新变量的指针,而不是指向已存在的变量,如此
CPolygon* ppoly1 = new CRectangle;
但是,rect
是变量,而不是类型,因此调用new rect
毫无意义。
答案 1 :(得分:2)
CPolygon * ppoly = new rect;
是一个无效的构造,因为rect
是main()
方法中定义的变量,而new
运算符需要一个类(或数组,或者结构,等等。)。
另一方面,CPolygon * ppoly = ▭
赋值将ppoly
值设置为rect
变量的堆栈地址。从子类到父类的转换指针是可能的,并且是合法的。
你的问题的标题也有点偏离课程,因为你不能分配一个引用,只能指定指针(甚至不是那些实际上是内存的那个指针)#'s已分配/保留并返回地址)