使用父类函数的C ++子类

时间:2012-10-26 17:32:31

标签: c++

我在这里遇到了一些问题。

  • 车辆是父类
  • 汽车和摩托车是儿童班

这是我的主要cpp文件

int main() {
    // assuming max size is up to 100
    VehicleTwoD *vehicletwod[100];
    int vehicleCounter = 0;

    Car *car = new Car();
    Motorcycle *motor = new Motorcycle();

    cout << " Please enter name of vehicle ";
    cin >> vehicleName;

    if (vehicleName == "Car") {
        vehicletwod[vehicleCounter] = car;

        //issue here
        vehicletwod[vehicleCounter].setName(vehicleName);
        //issue end

    }

    return 0;
}

这是我的car.cpp

struct Point {
    int x, y;
};

class Car: public Vehicle {
private:
    Point wPoint[4];
    double area;
    double perimter;
public:
    void setType(string);
    void setPoint();
    string getType();
    string getPoint();
}

这里的问题是setName是Vehicle的一个功能,但不是Car的功能。但我做了继承应该继承该功能。但似乎没有用。

它说...在vehicletwod [vehicleCounter]中请求setName'是非类型的VehicleTwoD *

以上问题已修复

附加问题:

好的,我通过更改修复了上一期。到 - &gt;

这是另一个问题。

代码是。在这一部分

 if (vehicleName == "Car") {
            vehicletwod[vehicleCounter] = car;

            vehicletwod[vehicleCounter]->setName(vehicleName);


           //now i want to setPoint which is a function of child class
           vehicletwod[vehicleCounter]->setPoint();
           //issue here
        }

我尝试将setPoint作为子类的函数,Car

然而它说..车辆没有名为'setPoint'的成员

在做约翰提到之后......上述问题也已修复..

但最困难的部分是如何检索已设置的内容,因为它是一个车辆对象,而不是汽车对象。

假设在setPoint之后,我想要getPoint()

我尝试这样做

vehicletwod [0] - &GT;用GetPoint();

我收到一条错误,说getPoint属于非类型'vehicletwod'

5 个答案:

答案 0 :(得分:2)

确定仍然不知道VehicleTwoD是什么,但如果你写了

,你会更接近正确
vehicletwod[vehicleCounter]->setName(vehicleName);

而不是

vehicletwod[vehicleCounter].setName(vehicleName);

您有一系列指针,因此您需要使用->

另一个问题是,setPoint只是Carnot Vehicle的成员,所以你必须在你的汽车之前调用它你添加它你的阵列。

像这样的东西

if (vehicleName == "Car") {
    car->setPoint();
    vehicletwod[vehicleCounter] = car;
    vehicletwod[vehicleCounter]->setName(vehicleName);
}

答案 1 :(得分:0)

您必须以不同方式实例化汽车和摩托车:

VehicleTwoD *car = new Car();
VehicleTwoD *motor = new Motorcycle();

然后将要在子类中使用的方法声明为protected。

欢迎你!

PD:汽车不是VehicleTwoD,分类学很重要。

答案 2 :(得分:0)

vehicletwod [vehicleCounter]是一个指针,因此您需要取消引用它。试试vehicletwod [vehicleCounter] - &gt; setName(vehicleName)。

您可能想要阅读指针。谷歌“c ++类指针基础”或结帐http://www.codeproject.com/Articles/627/A-Beginner-s-Guide-to-Pointers

答案 3 :(得分:0)

似乎VehicleTwoD似乎没有这样的方法:

protected:
virtual void setPoint();

由于数组的定义,你需要这个。

答案 4 :(得分:0)

VehicleTwoD没有setPoint(),所以你必须将VehicleTwoD *动态播放到Car *,但你必须确保vehicletwod [vehicleCounter]真正指向Car的对象,否则它是运行时错误!

dynamic_cast<Car*>(vehicletwod[vehicleCounter])->setPoint();

最好的方法是将setPoint()作为VehicleTwoD的纯虚函数;

class VehicleTwoD {
public:
    virtual void setPoint() = 0;
    /***/
};

在派生类中实现setPoint()。