+ -
当前位置:首页 → 问答吧 → 100分求助,虚函数的一个问题

100分求助,虚函数的一个问题

时间:2011-12-11

来源:互联网

书上先给出下面的例子,然后说"在main()中定义指向根基类的指针p可以指向派生类对象"。不理解这句话,main函数中 Circle cir(10,3,6); 
fun(&cir);
哪里指向根基类了?请教。

#include <iostream.h> 
const double PI=3.14159; 
class Point

public: 
Point(double i, double j){x=i;y=j;} 
virtual double Area(){return 0.0;}  
private: 
double x, y; //点坐标 
};
 
class Circle: public Point

  double radius; //增加新成员"半径" 
public: 
  Circle(double r, double i, double j)  
  :Point(i,j),radius(r){} 
  virtual double Area()
  { return PI*radius*radius;}
}; 
void fun(Point *p)
{ cout<<p->Area()<<endl; }

void main()

Circle cir(10,3,6); 
fun(&cir);
}

作者: blase2234   发布时间: 2011-12-11

void fun(Point *p)

你传入&cir就自动转换为Point*了

而p->Area调用的其实是cir.Area

作者: yisikaipu   发布时间: 2011-12-11

作者: Demon__Hunter   发布时间: 2011-12-11

那也不是在main()中定义指向根基类,而是在fun函数中定义指向根基类啊

作者: blase2234   发布时间: 2011-12-11

void main()
{  
Point *cir=new Circle(10,3,6); 
 
fun(cir);
delete cir;
}

用这个main来体会一下吧

作者: mstlq   发布时间: 2011-12-11

从派生类的角度去看,所有的派生类都可以看成 is a type of baseclass,派生类都可以自动向上类型转换为baseclass,所以。circle 从point派生出来,就可以看成是一个baseclass,Area()函数是虚函数,意味着它在派生类中会有各种不同的实现,但是接口外观都一样,在fun()中baseclass指向的是哪个派生类对象,就调用哪个对象的Area()

作者: yby4769250   发布时间: 2011-12-11

C/C++ code

#include <iostream>
using namespace std;


const double PI=3.14159;  
class Point
{  
public:  
    Point(double i, double j){x=i;y=j;} 
    
    //注意Area是虚函数,在继承的时候要实现多态
    virtual double Area(){return 0.0;}   
private:  
    double x, y; //点坐标  
};

class Circle: public Point
{  
    double radius; //增加新成员"半径"  
public:  
    Circle(double r, double i, double j)   
        :Point(i,j),radius(r){}  
    //继承来自基类Point的Area方法,此方法是virtual
    virtual double Area()
    { return PI*radius*radius;}
};  

void fun(Point *p)
{
    cout<<p->Area()<<endl; 
}


int main()
{  
    Circle cir(10,3,6); 
    //将派生类对象cir赋给基类Point类型
    //多态在指针的时候起作用
    fun(&cir);
    return 0;
}


作者: elegant87   发布时间: 2011-12-11

继承的时候实现多态,是通过virtual关键字进行

将一个派生类对象赋给一个基类的对象时候在如下情况下实现多态
1、将派生类对象赋给一个基类的指针对象
2、将派生类对象赋给一个基类的引用

作者: elegant87   发布时间: 2011-12-11

在调用函数void fun(Point *p)的时候,将派生类对象cir赋给了Point的指针

这个时候p指向的是派生类对象cir
void fun(Point *p)
{
cout<<p->Area()<<endl; 
}

作者: elegant87   发布时间: 2011-12-11