C++继承问题

#include <iostream.h>
#define PI 3.1415926
class circle // 圆
{
public:
double r; //圆半径
circle(double x)
{
r=x;
}
double area() //圆面积
{
return PI*r*r;
}
};

class ball:public circle //球
{
public:
double Area() //球面积
{
return 4*PI*r*r*r;
}
};

class ti:public circle //圆柱
{
public:
double h;
ti(double x) // 运行时指向此行出错
{
h=x;
}
double carea() //圆柱面积
{
return PI*r*r*2+2*PI*r*h;
}
};

main()
{
circle ci(3);
ball ba; // 运行时指向此行出错
ti t(4);
cout<<"圆面积:"<<ci.area()<<endl;
cout<<"球面积:"<<ba.Area()<<endl;
cout<<"球柱面积:"<<t.carea()<<endl;
return 0;
}

// 运行时的结果如下
'circle':no appropriate default constructor available (没有默认的构造函数可用)
'ball':no appropriate default constructor available

虽然我找到了解决法案,但不知道这个问题出在哪里,为什么不能这样继承,要怎么去改正。谢谢 问题一解决 马上给分

因为你在ball这个类中没有定义构造函数,编译器会自动为你构造一个无参的构造函数ball(),并且该构造函数会自动调用circle的无参构造函数,而你在circle中没有定义无参的构造函数,由于你已经定义了一个构造函数
circle(double x)
{
r=x;
}
所以编译器也不会自动在为其生成一个无参的默认构造函数了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-07-01
能这样继承,方法就是使用冒号语法.
eg:
给你的Ball类添加构造函数
ball(double dbVar):circle(dbVar)
{
}
有因是基类构造需要参数,你必须传递参数给它,它才能创建.调用它的原因是:
C++在构造子类的时候必先构造父类,而父类需要参数.
第2个回答  2009-07-01
问题是你写的ba这句话默认调用父类无参数的构造函数,但是父类'circle'只有一个构造函数circle(double x),没有无参数的构造函数。
本来编译器会给你生成一个无参数的构造函数的,但是你自己写了一个有参数的构造函数以后编译器认为你已经有了就不会帮你生成无参数的构造函数了。所以你试图调用父类的时候就报错告诉你没有这个函数可用
第3个回答  2009-07-01
circle的构造函数是circle(double x),在继承它的时候,在子类的构造函数中调用该函数。如果不是这样,想一下,子类中r应该等于多少呢?