Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;从基类实例调用派生函数 我对C++是相当新的,但是我遇到了一个我似乎无法解决的问题。 我将用汽车来说明这个问题,只是为了让事情变得更简单。 好吧,让我们假设我有一辆基本等级的汽车,我有不同的品牌继承了这一等级。像这样: class Car { public: Car(); }; class Ford: public Car { public: Ford(); void drive(); void park(); }; vector<Car*> cars; cars.push_back(new Ford()); cars.back()->drive(); //this won't work_C++_Function_Vector_Derived Class - Fatal编程技术网

C++;从基类实例调用派生函数 我对C++是相当新的,但是我遇到了一个我似乎无法解决的问题。 我将用汽车来说明这个问题,只是为了让事情变得更简单。 好吧,让我们假设我有一辆基本等级的汽车,我有不同的品牌继承了这一等级。像这样: class Car { public: Car(); }; class Ford: public Car { public: Ford(); void drive(); void park(); }; vector<Car*> cars; cars.push_back(new Ford()); cars.back()->drive(); //this won't work

C++;从基类实例调用派生函数 我对C++是相当新的,但是我遇到了一个我似乎无法解决的问题。 我将用汽车来说明这个问题,只是为了让事情变得更简单。 好吧,让我们假设我有一辆基本等级的汽车,我有不同的品牌继承了这一等级。像这样: class Car { public: Car(); }; class Ford: public Car { public: Ford(); void drive(); void park(); }; vector<Car*> cars; cars.push_back(new Ford()); cars.back()->drive(); //this won't work,c++,function,vector,derived-class,C++,Function,Vector,Derived Class,整个想法是把所有这些不同的汽车放在一个单一的汽车类型向量中。像这样: class Car { public: Car(); }; class Ford: public Car { public: Ford(); void drive(); void park(); }; vector<Car*> cars; cars.push_back(new Ford()); cars.back()->driv

整个想法是把所有这些不同的汽车放在一个单一的汽车类型向量中。像这样:

class Car
{
    public:
       Car();
};

class Ford: public Car
{
    public:
        Ford();
        void drive();
        void park();
};
vector<Car*> cars;
cars.push_back(new Ford());
cars.back()->drive(); //this won't work
矢量车;
汽车。向后推(新福特());
汽车。倒车()->驾驶()//这行不通

如何在基类实例上调用派生函数?注意,我想把这些都放在一个向量中。这背后的原因是因为我只想使用添加的最后一个派生的car类实例(在本例中,派生的car类是ford)。还请注意,所有car类都将具有相同的函数。

如果这些函数对所有派生类都是通用的,那么您就有一个通用接口,因此您应该通过基类来表示。为此,将这些函数声明为纯虚拟函数:

class Car {
public:
    virtual void drive() = 0;  // Pure-virtual function
};

class Ford : public Car {
public:
    virtual void drive() { std::cout << "driving Ford\n"; }
};

...

vector<Car*> cars;
cars.push_back(new Ford());
cars.back()->drive(); //this will work
等级车{
公众:
虚拟空驱动器()=0;//纯虚拟函数
};
福特级:公共汽车{
公众:
虚拟空驱动器(){std::cout drive();//这将起作用

(在另一个注释中,有一个原始指针的向量通常被认为是很差的实践,因为它使得内存管理很棘手。你应该考虑使用智能指针。)

< P>如果所有的<代码> CAR/<代码>类都有相同的函数,则在基类<代码> CAR> <代码>:< /P>中声明它们为纯<代码>虚拟< /代码>。
class Car
{
public:
    Car();
    virtual ~Car();
    virtual void drive() = 0;
    virtual void park()  = 0;
};

这将允许使用
vector
的示例代码按发布的方式工作。

如果可能,可以将基类定义为

class Car
{
    public:
       Car();
       virtual void drive();
};

您必须定义如下所示的接口:

class Car{
public:
 Car();
 virtual void moveForward(unsigned int speed) = 0;
 virtual void moveBack(unsigned int speed) = 0;
 //...
 virtual ~Car();
};
别忘了让析构函数虚拟化。 之后,您只需要在子类中实现这些方法,然后调用它们。
同样,在vector中,您可以使用共享的ptr,也可以直接传递实例。

您有两个选择:要么在汽车定义中使用virtual drive()方法,要么将汽车指针强制转换为Ford pointers。很可能您会想做第一个

class Car
{
    public:
       Car();
       virtual void drive() { // default implementation}
};
现在,您可以驾驶()您的汽车了!您还可以使drive()成为纯虚拟函数,如下所示:

class Car
{
    public:
       Car();
       virtual void drive() = 0;
};
这基本上意味着drive()没有默认实现:它必须在子类中重新实现。我提到的第二种方法是强制转换指针,您可能不希望这样做,但为了完整性,应该包括这种方法:

static_cast<Ford*>(cars.back())->drive();
static_cast(cars.back())->drive();

但是,只有事先知道这辆车是福特车,并且在这种情况下没有多大用处,这才有效。您还可以查看动态投射。

您必须设置一个虚拟功能

基类中的虚拟函数。 虚拟函数可以在子类中实现,因此可以专门化drive()的行为

您可以在此处找到有关虚拟函数的常见问题解答(或教程):


非常感谢您的快速响应,这就成功了。是的,我将使用第一种方法,但很高兴知道还有另一种方法。感谢您提供的信息!@Anthony,我认为对于第二种方法,最好使用动态施法,而不是静态施法