[英]Why can a derived class not access a protected member of its base class through a pointer to base?
[英]How to access member functions of a derived class through a base pointer?
#include <iostream>
#include <string>
using namespace std;
class Shape {
private:
string name;
public:
Shape(){name = "Shape";}
Shape(string n){name = n;}
void setName(string n){name = n;}
string getName(){return name;}
double calcarea(){return 0;}
};
class Square : public Shape {
private:
double side;
public:
Square(){side = 1; Shape("Square");}
Square(double s){side = s; Shape("Square");}
void setSide(double s){side = s;}
double getSide(){return side;}
double calcarea(){double area = side * side; return area;}
};
class Circle : public Shape{
private:
double radius;
public:
Circle(){radius = 1; Shape("Circle");}
Circle(double r){radius = r; Shape("Circle");}
Circle(double ra, string n){radius = ra; setName(n);}
void setRadius(double r){radius = r;}
double getRadius(){return radius;}
double calcarea(){double area = 3.14 * radius * radius; return area;}
};
int main()
{
Shape* shapepointer[5];
shapepointer[0] = new Shape;
shapepointer[1] = new Square;
shapepointer[2] = new Circle;
shapepointer[3] = new Circle;
shapepointer[4] = new Square;
shapepointer[1]->setSide(3);
shapepointer[2]->setRadius(2);
shapepointer[3]->setRadius(7);
shapepointer[4]->setSide(5);
return 0;
}
如果我沒有正確格式化這篇文章或未能在帖子中做一些讓你的生活更輕松的事情,我深表歉意,我是新來的,抱歉模組/閱讀本文的人。 所以我的任務是:
“創建一個 main() function 以創建一個名為 shapepointer[] 大小為 5 的基本指針數組。為這些指針動態創建/實例化以下形狀...”
現在一切都很順利,我創建了類、它們的構造函數、重載的構造函數,以及訪問器和修改器。 但是,現在我已經在 main() 中實例化了一個作為基指針的數組,我得到錯誤no member named 'setSide' in 'Shape' and no member named 'setRadius' in 'Shape'
根據我從錯誤消息中的解釋,形狀指針似乎是基礎 class 因此無法訪問它嘗試使用的派生 class 的成員函數。 我不知道如何解決這個問題,因為任務的說明要求指針是基本的 class 指針。 我也很困惑,因為如果我解釋的是真的,那么使用我使用的基本數組/指針從其他類動態實例化對象怎么沒有錯誤? 我真的很感激一些幫助來解決這個問題,謝謝。
我想到了。 class 伙伴幫助了我:
Shape* shapepointer[5];
shapepointer[0] = new Shape();
shapepointer[1] = new Square(3);
shapepointer[2] = new Circle(2);
shapepointer[3] = new Circle(7);
shapepointer[4] = new Square(5);
簡單修復,將動態分配的對象更改為構造函數。 calcarea() function 也被設置為基礎 class 'Shape' 中的虛擬 function。
在我看來,錯誤的出現是因為shapepointer數組中的一個元素指向“ Shape ” class object。 在 memory 中, shapepointer class object 的指針可以在ZA2F2ED4F8EBC4ABC2CBB4DZ21A29的成員中訪問另一方面, shapepointer指針沒有setSide或setRadius 的任何 function 。
您可以在Shape class 中將這些功能定義為虛擬 function並享受它。
int main()
{
Shape* shapepointer[5];
shapepointer[0] = new Shape;
shapepointer[1] = new Square;
shapepointer[2] = new Circle;
shapepointer[3] = new Circle;
shapepointer[4] = new Square;
((Square*)shapepointer[1])->setSide(3);
((Circle*)shapepointer[2])->setRadius(2);
((Circle*)shapepointer[3])->setRadius(7);
((Square*)shapepointer[4])->setSide(5);
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.