【发布时间】:2019-10-03 21:33:14
【问题描述】:
要实现多态,我们需要使用一个基类指针指向一个派生类实例。多态性的一切都很好,除了,如果每个派生类都有一个或几个自己的成员函数怎么办?如果基类指针不能访问这些派生类的成员函数,那么多态有什么方便呢?
下面是一个例子。 “形状”是一个基类。 “square”和“circle”是两个派生类。
class shape {
public:
virtual void getArea()=0;
};
class square: public shape {
private:
int edge;
public:
square(){edge = 1;}
virtual void getArea(){ //polymorphism
cout << edge*edge << "\n";
}
void getNumberOfEdge(){ //a new member function
cout << "4\n";
}
};
class circle: public shape {
private:
int radius;
public:
circle(){radius = 1;}
virtual void getArea(){ //polymorphism
cout << 3*radius*radius << "\n";
}
void getCurvature(){ //a new member function
cout << 1/radius << "\n";
}
};
int main(){
shape* arr[2] = {
new square(),
new circle()
};
arr[0]->getArea();
arr[1]->getArea();
arr[0]->getNumberOfEdge(); //compiler error
}
getArea() 是实现多态性的一个很好的例子。但是访问派生类成员函数会给我编译器错误,我完全理解为什么。但从设计的角度来看,我们并不想为了每个派生类而在基类中添加一堆虚函数,对吧?
【问题讨论】:
-
当然,如果您尝试混合不同的东西(正方形和圆形),这不是很好,但是如果您有一堆相似的东西(所有不同类型的多边形),那么它会非常有效。多态只是编程工具箱中的一种工具
-
但是看起来为了这个目的(所有不同类型的多边形)我可以只使用一个类“多边形”并有几个实例,对吧?拥有一堆派生类的全部意义在于它们都有自己的特征,因此成员更多。
-
这是题外话,但您不应该多态地使用原始 C 样式数组。数组索引将使用基类的大小移动到正确的地址,但派生类通常可能比基类大。最好包含
std::unique_ptr的数组。
标签: c++