回 帖 发 新 帖 刷新版面

主题:[原创]指向类函数成员的指针来实现虚函数的多态性

[size=3]#include <iostream>
using namespace std;
class shape
{
public:
    virtual double area()=0;
};
class square:public shape
{
protected:
    double H;
public:
    square(double h)
    {
        H=h;
    }
    double area()
    {
        return H*H;
    }
};
class circle:public square
{
private:
    const double PI;
public:
    circle(double r):square(r),PI(3.1415)
    {
    }
    double area()
    {
        return H*H*PI;
    }
};

class triangle:public square
{
protected:
    double W;
public:
triangle(double h,double w):square(h)
    {
        W=w;
    }
    double area()
    {
        return W*H/2.0;
    }
};
void print(shape *s[],int n)
{
    double shape::*p()=shape::area;
    int i;
    for(i=0;i<n;i++)
    {  
    cout<<"shape"<<i+1<<"的面积是:"<<(s[i].*p)()<<endl;
    }
}
int main()
{
  shape *s[6];

  s[0]=new square(5);
  s[1]=new circle(8);
  s[2]=new triangle(5,8);
  s[3]=new square(6);
  s[4]=new circle(10);
  s[5]=new triangle(6,10);
print(s,6);
return 0;
} [/size]

无法通过编译,各位大虾帮帮忙


  
    


        

回复列表 (共4个回复)

沙发

首先这一句:
double shape::*p()=shape::area;
是不对的,改为double (shape::*p)()=&shape::area;

另外不明白楼主为什么要这样写,多态是通过指向基类的指针实现的,像下边这样就行:
    //double (shape::*p)()=&shape::area;
    int i;
    for(i=0;i<n;i++)
    {  
        
        //cout<<"shape"<<i+1<<"the area is:"<<(s[i]->*p)()<<endl;
                  cout<<"shape"<<i+1<<"the area is:"<<s[i]->area()<<endl;
    }

板凳

double (shape::*p)()=&shape::area; 

//通过这句只能取到基类shape中的area的地址,无法获取派生类中相应函数的地址;

如果楼主是想通过p获取各个派生类中area的地址,那肯定是无法实现的,因为在函数
void print(shape *s[],int n)中,你无法知道s[i]中存储的对象的实际类型,你必须先判断s[i]指向的实际类型(假设为T),再通过&T::area的形式获取。但这样就失去多态的意义了。

3 楼

不好意思上面写错了,更正为:
void print(shape *s[],int n)
{
    double (shape::*p)()=&shape::area;
    int i;
    for(i=0;i<n;i++)
    {  
        cout<<"shape"<<i+1<<"the area is:"<<(s[i]->*p)()<<endl;
    }
}

4 楼

[quote]首先这一句:
double shape::*p()=shape::area;
是不对的,改为double (shape::*p)()=&shape::area;

另外不明白楼主为什么要这样写,多态是通过指向基类的指针实现的,像下边这样就行:
    //double (shape::*p)()=&shape::area;
    int i;
    for(i=0;i<n;i++)
    {  
        
        //cout<<"shape"<<i+1<<"the area is:"<<(s[i]->*p)()<<endl;
                  cout<<"shape"<<i+1<<"the area is:"<<s[i]->area()<<endl;
    }[/quote]

[size=3]因为我想弄懂关于指向类成员函数的指针的知识点,才写了这个程序。呵呵。。。。谢谢你喔,前辈![/size]

我来回复

您尚未登录,请登录后再回复。点此登录或注册