如何在子 class 中使用 c++ 中的构造函数获取其父 class 的变量来实现抽象 class 的方法
How to implement an abstarct class's method in sub-class by getting variables of it's parents class using a constructor in c++
首先,有一个名为 Shape 的父 class 它有两个构造函数,一个带有一个参数,另一个带有两个 parameter.There 是两个继承属性的 classes来自 class“形状”。它们是矩形和圆形。
我用 java 试了一下,我得到了我想要的。
这是 java 实现..
package javaapplication6;
import java.io.*;
abstract class Shape{
protected int radius,length,width;
public Shape(int n){
radius=n;
}
public Shape(int x,int y){
length=x;
width=y;
}
abstract public void getArea();
}
class Rectangle extends Shape{
public Rectangle(int x,int y){
super(x,y);
}
public void getData(){
System.out.println(length+" "+width);
}
public void getArea(){
System.out.println("Area of Reactangle is : "+width*length);
}
}
class Circle extends Shape{
public Circle(int x){
super(x);
}
public void getData(){
System.out.println(radius);
}
public void getArea(){
System.out.println("Area of Reactangle is : "+2*radius*3.14);
}
}
public class JavaApplication6 {
public static void main(String[] args) {
Rectangle r=new Rectangle(3,4);
r.getData();
r.getArea();
System.out.println();
Circle c=new Circle(3);
c.getData();
c.getArea();
}
}
我想要用 C++ 实现的确切内容..
我试过如下...
#include<bits/stdc++.h>
using namespace std;
class Shape{
public:
int r,x,y;
Shape(int rad){
r=rad;
}
Shape(int height,int width){
x=height;
y=width;
}
void getClass(){
cout<<"Ur in class shape"<<endl;
}
virtual void getArea();
};
class Rectangle : public Shape{
public:
Rectangle(int x,int y):Shape(x,y){}
void getArea(){
cout<< "Area of rectangle : "<<x * y<<endl;
}
void getClass(){
cout<<"Ur in class Rectangle"<<endl;
}
};
class Circle : public Shape{
public:
Circle(int r):Shape(r){}
vooid getArea(){
cout<< "Area of Circle : "<<2* 3.14 * r<<endl;
}
void getClass(){
cout<<"Ur in class Circle"<<endl;
}
};
int main(){
Circle c(5);
c.getClass();
c.getArea();
Rectangle r(3,4);
r.getClass();
r.getArea();
}
但是我收到一个错误..
abstract.cpp:(.rdata$.refptr._ZTV5Shape[.refptr._ZTV5Shape]+0x0): undefined reference to `vtable for Shape'
您收到错误是因为 Shape::getArea
没有定义,也没有声明为纯虚拟:
virtual void getArea();
要使其成为纯虚拟,您需要:
virtual void getArea() = 0;
你还应该提供一个虚拟析构函数。何时需要以及何时不需要超出了这个问题的范围。最简单的就是提供它:
virtual ~Shape(){};
“Undefined reference to vtable”错误是由于没有为所有未定义纯虚拟的 virtual
函数提供定义。
在你的例子中,你声明了 Shape::getArea
,但是你没有声明它是纯的 virtual
或者给它一个定义,这是你问题的根源:
class Shape{
...
virtual void getArea(); // declared, but not pure virtual or defined
};
要使其成为纯虚拟的,最后需要 = 0
。
class Shape{
...
virtual void getArea() = 0;
};
首先,有一个名为 Shape 的父 class 它有两个构造函数,一个带有一个参数,另一个带有两个 parameter.There 是两个继承属性的 classes来自 class“形状”。它们是矩形和圆形。
我用 java 试了一下,我得到了我想要的。
这是 java 实现..
package javaapplication6;
import java.io.*;
abstract class Shape{
protected int radius,length,width;
public Shape(int n){
radius=n;
}
public Shape(int x,int y){
length=x;
width=y;
}
abstract public void getArea();
}
class Rectangle extends Shape{
public Rectangle(int x,int y){
super(x,y);
}
public void getData(){
System.out.println(length+" "+width);
}
public void getArea(){
System.out.println("Area of Reactangle is : "+width*length);
}
}
class Circle extends Shape{
public Circle(int x){
super(x);
}
public void getData(){
System.out.println(radius);
}
public void getArea(){
System.out.println("Area of Reactangle is : "+2*radius*3.14);
}
}
public class JavaApplication6 {
public static void main(String[] args) {
Rectangle r=new Rectangle(3,4);
r.getData();
r.getArea();
System.out.println();
Circle c=new Circle(3);
c.getData();
c.getArea();
}
}
我想要用 C++ 实现的确切内容..
我试过如下...
#include<bits/stdc++.h>
using namespace std;
class Shape{
public:
int r,x,y;
Shape(int rad){
r=rad;
}
Shape(int height,int width){
x=height;
y=width;
}
void getClass(){
cout<<"Ur in class shape"<<endl;
}
virtual void getArea();
};
class Rectangle : public Shape{
public:
Rectangle(int x,int y):Shape(x,y){}
void getArea(){
cout<< "Area of rectangle : "<<x * y<<endl;
}
void getClass(){
cout<<"Ur in class Rectangle"<<endl;
}
};
class Circle : public Shape{
public:
Circle(int r):Shape(r){}
vooid getArea(){
cout<< "Area of Circle : "<<2* 3.14 * r<<endl;
}
void getClass(){
cout<<"Ur in class Circle"<<endl;
}
};
int main(){
Circle c(5);
c.getClass();
c.getArea();
Rectangle r(3,4);
r.getClass();
r.getArea();
}
但是我收到一个错误..
abstract.cpp:(.rdata$.refptr._ZTV5Shape[.refptr._ZTV5Shape]+0x0): undefined reference to `vtable for Shape'
您收到错误是因为 Shape::getArea
没有定义,也没有声明为纯虚拟:
virtual void getArea();
要使其成为纯虚拟,您需要:
virtual void getArea() = 0;
你还应该提供一个虚拟析构函数。何时需要以及何时不需要超出了这个问题的范围。最简单的就是提供它:
virtual ~Shape(){};
“Undefined reference to vtable”错误是由于没有为所有未定义纯虚拟的 virtual
函数提供定义。
在你的例子中,你声明了 Shape::getArea
,但是你没有声明它是纯的 virtual
或者给它一个定义,这是你问题的根源:
class Shape{
...
virtual void getArea(); // declared, but not pure virtual or defined
};
要使其成为纯虚拟的,最后需要 = 0
。
class Shape{
...
virtual void getArea() = 0;
};