#include<iostream>
using namespace std;
class shape
{
public:
virtual int area();
shape()
{
cout<<"调用shape构造函数"<<endl;
}
~shape()
{
cout<<"调用shape析构函数"<<endl;
}
};
class rectangle:
public shape
{
private:
int x;
int y;
public:
void in()
{
cout<<"请输入矩形长宽"<<endl;
cin>>x>>y;
}
virtual int area();
rectangle()
{
cout<<"调用rectangle构造函数"<<endl;
}
~rectangle()
{
cout<<"调用rectangle析构函数"<<endl;
}
};
class circle:
public shape
{
private:
float r;
public:
void in()
{
cout<<"请输入圆形的半径"<<endl;
cin>>r;
}
virtual int area();
circle()
{
cout<<"调用circle构造函数"<<endl;
}
~circle()
{
cout<<"调用circle析构函数"<<endl;
}
};
class square:
public rectangle
{
private:
int a;
public:
void in()
{
cout<<"请输入方形的边长"<<endl;
cin>>a;
}
virtual int area();
square()
{
cout<<"调用square构造函数"<<endl;
}
~square()
{
cout<<"调用square析构函数"<<endl;
}
};
int main(void)
{
circle c;
rectangle r;
square s;
c.in();
r.in();
s.in();
cout<<"圆形面积"<<c.area()<<endl;
cout<<"矩形面积"<<r.area()<<endl;
cout<<"方形面积"<<s.area()<<endl;
}
int rectangle::area()
{
return x*y;
}
int circle::area()
{
return 3.14*r*r;
}
int square::area()
{
return a*a;
}
编译时报错信息为:
C:\Users\Administrator\AppData\Local\Temp\ccLhjdDA.o In function shape::shape()':
vtable for shape'
10 C:\Users\Administrator\Desktop\未命名2.cpp undefined reference to
C:\Users\Administrator\AppData\Local\Temp\ccLhjdDA.o In function shape::~shape()':
vtable for shape'
15 C:\Users\Administrator\Desktop\未命名2.cpp undefined reference to
C:\Users\Administrator\Desktop\collect2.exe [Error] ld returned 1 exit status
一楼说的不对。
r是派生类的私有成员,派生类的成员函数可以访问。
从浮点型到整型,会有warning,但不会有error和fatal。
问题出在shape类的虚函数int area()只有声明,没有定义。
C++ Primer第5版中文版,536页:因为我们直到运行时才能知道到底调用了哪个版本的虚函数,所以所有虚函数都必须有定义。通常情况下,如果我们不使用某个函数,则无需为该函数提供定义。但是我们必须为每一个虚函数都提供定义,而不管它是否被用到了,这是因为连编译器也无法确定到底会使用哪个虚函数。
int circle::area()
{
return 3.14*r*r;
}
这里有两个错误
一个r是私有的,派生类访问不了
一个是,这个结果是浮点,你却定义了int