2014-11-21 73 views
0

,如果我有一个基础类(受保护的或私有继承)派生类继承我可以让基类的指针指向派生类对象? 这是我的C++代码:如果继承类型受保护,我可以使基类的指针指向派生对象吗?

#include<iostream.h> 
#include<conio.h> 
class Geoshape 
{ 
protected: 
    int dim1; 
    int dim2; 

public: 
    Geoshape() 
     {dim1=0;dim2=0;} 
    Geoshape(int x, int y) 
     {dim1=x ; dim2=y;} 
    void setDim1(int x) 
     {dim1=x;} 
    int getDim1() 
     {return dim1;} 
    void setDim2(int y) 
     {dim2=y;} 
    int getDim2() 
     {return dim2;} 
    int calculateArea() 
     {return dim1*dim2;} 
}; 
class Circle:protected Geoshape 
{ 
public: 
    Circle() 
     {} 
    Circle(int r):Geoshape(r,r) 
     {dim1=r;dim2=r;} 
    void setR(int r) 
     {dim1=dim2=r;} 
    int getR() 
     {return dim1;} 
    float calculateArea() 
     {return 22.0/7*dim1*dim2;} 
}; 
class Triangle:public Geoshape 
{ 
public: 
    Triangle() 
     {} 
    Triangle(int x, int y):Geoshape(x,y) 
     {} 
    void setH(int h) 
     {dim2=h;} 
    int getH() 
     {return dim2;} 
    void setB(int b) 
     {dim1=b;} 
    int getB() 
     {return dim1;} 
    float calculateArea() 
     {return .5*dim1*dim2;} 
}; 
class Rectangle:public Geoshape 
{ 
public: 
    Rectangle() 
     {} 
    Rectangle(int x, int y):Geoshape(x,y) 
     {} 
    void setL(int l) 
     {dim1=l;} 
    int getL() 
     {return dim1;} 
    void setH(int h) 
     {dim2=h;} 
    int getH() 
     {return dim2;} 
}; 
class Square:protected Rectangle 
{ 
public: 
    Square() 
     {} 
    Square(int l):Rectangle(l,l) 
     {dim1=l;dim2=l;} 
    void setL(int l) 
     {dim1=dim2=l;} 
    int getL() 
     {return dim1;} 
    float calculateArea() 
     {return dim1*dim1;} 
}; 

void main() 
{ 
clrscr(); 
cout<<"enter circle raduis: "; 
int raduis; 
cin>>raduis; 
Circle c1(raduis); 
cout<< "this is area of Circle: "<<c1.calculateArea(); 
getch(); 
cout<<"\n\nenter base of triangle: "; 
int base; 
cin>>base; 
cout<<"enter height of triangle: "; 
int height; 
cin>>height; 
Triangle t1(base,height); 
cout<< "this is area of Triangle: "<<t1.calculateArea(); 
getch(); 
cout<<"\n\nenter length of rectangle: "; 
int length; 
cin>>length; 
cout<<"enter height of rectangle: "; 
int height1; 
cin>>height1; 
Rectangle r1(length,height1); 
cout<< "this is area of Rectangle: "<<r1.calculateArea(); 

getch(); 
cout<<"\n\nenter length of square: "; 
int len; 
cin>>len; 
Square s1(len); 
cout<< "this is area of Square: "<<s1.calculateArea(); 
Geoshape *p1;Geoshape *p2;Geoshape *p3;Geoshape *p4; 
p2=&t1; 
p3=&r1; 
getch(); 
} 

我想补充这两条线在主:

P1 = &c1;
P4 = &s1; 但是这给错误!

+0

编译器说“不”,你不相信吗? :) – jrok 2014-11-21 17:15:28

+0

受保护的继承?你为什么要使用它? (公共 - > *是*,私人 - > *在*方面实现的,受保护的 - !?!?> *。*) – Borgleader 2014-11-21 17:15:40

+0

[以供将来参考,你要提供一个** **最小的,完整的,和可核查的示例](http://stackoverflow.com/help/mcve)(强调最小的;你有完全和可验证虽然) – Cornstalks 2014-11-21 17:15:47

回答

1

你可以做到这一点(投给“基地”型)只能从类(从成员函数和静态成员函数)内,从派生类(仅适用于公共或保护继承的情况下)或者从朋友的功能。若要做到这一点不受限制的能力,您可以:

  • 使用公有继承,
  • 提供用户指定的转换操作符,
  • 提供将返回这样的指针(essentialy与上述相同的功能,但不是“运算符T()”,而是“T * getBase()”或者这样的形式) - 成员函数,独立好友函数的静态成员函数。
+1

感谢你们所有人。这里是我的问题的答案 http://stackoverflow.com/questions/9661936/inheritance-a-is-an-inaccessible-base-of-b – Mouneer 2014-11-21 18:14:48

相关问题