C++ 虚拟函数不工作

C++ 虚拟函数不工作,c++,virtual-functions,C++,Virtual Functions,第一类是: class SistemPornire{ protected: Motor &_motor; Electromotor &_electromotor; public: SistemPornire(Motor&,Electromotor&); virtual void pornire_motor(); void opreste_motor(); }; 虚拟功能的实现是: SistemPornire::Siste

第一类是:

class SistemPornire{
protected:
    Motor &_motor;
    Electromotor &_electromotor;

public:
    SistemPornire(Motor&,Electromotor&);
    virtual void pornire_motor();
    void opreste_motor();
};
虚拟功能的实现是:

SistemPornire::SistemPornire(Motor &motor, Electromotor &electromotor)
    :_motor(motor), _electromotor(electromotor)
{
}

void SistemPornire::pornire_motor()
{
     std::cout << "Sistemul de pornire a trimis comanda porneste_motor electromotorului." << std::endl;
    this->_electromotor.start(_motor);
}
其执行:

SistemPornireCuPreincalzire::SistemPornireCuPreincalzire(Motor&motor, Electromotor&electromotor)
    : SistemPornire(motor, electromotor)
{

}

void SistemPornireCuPreincalzire::pornire_motor()
{
    std::cout << "A inceput preincalzirea" <<std::endl<< "Preincalzirea incheiata" << std::endl;

    std::cout << "Sistemul de pornire a trimis comanda porneste_motor electromotorului." << std::endl;
    this->_electromotor.start(_motor);
}
主要功能:

int main()
{
    Motor motor;
    Electromotor electromotor;
    SistemPornire sistempornire(motor, electromotor);
    SistemDirectie sistemdirectie;
    SistemPornireCuPreincalzire sistempornireINC(motor, electromotor);

    Autoturism masina(sistempornireINC, electromotor, motor,sistemdirectie);

    std::cout << "Porneste autoturism:" << std::endl;
    masina.porneste_autoturism();

    std::cout << "Parcheaza autoturism:" << std::endl;
    masina.parcheaza_autoturism();

    std::cout << "Condu la destinatie:" << std::endl;
    masina.condu_la_destinatie();
    return 0;
}
intmain()
{
电机;
电动机;
SistemPornire SistemPornire(电机、电动机);
SistemDirectie SistemDirectie;
SistemPornireCuPreincalzire sistempornireINC(电机、电动机);
自动旅游公司(sistempornireINC,电动机,电动机,sistemdirectie);
标准::coutedit

在更新后的问题中,@Roddy指出,切片发生在
自动旅游
构造函数中

通过将衍生对象指定给基础对象,可以对对象进行切片

SistemPornireCuPreincalzire derived = SistemPornireCuPreincalzire();

SistemPornire base = derived; // sliced
您需要通过引用引用派生类:

SistemPornireCuPreincalzire derived = SistemPornireCuPreincalzire();

SistemPornire& base = derived; // no slicing
见:


让我们看看代码的某些部分,并分析发生了什么。这是您在
main
中的代码:

Motor motor;
Electromotor electromotor;
SistemPornire sistempornire(motor, electromotor);
SistemDirectie sistemdirectie;
SistemPornireCuPreincalzire sistempornireINC(motor, electromotor);
请注意,您如何在此处创建一个
SistemPornireCuPreincalzire
实例,然后将其传递到
自动旅游的构造函数中:

Autoturism masina(sistempornireINC, electromotor, motor,sistemdirectie);
让我们先看一下
自动旅游的构造,好吗

Autoturism(SistemPornire&, Electromotor&, Motor&, SistemDirectie&);
嗯,它引用了一个
SistemPornire
,我们正在传递一个对
SistemPornireCuPreincalzire
的引用。这不一定是一个错误,但足以让你思考。那么让我们来看看
自动旅游
构造函数的功能:

Autoturism::Autoturism(SistemPornire &sp, Electromotor&e, 
                       Motor&m, SistemDirectie&sd)
    : sistem_pornire(sp), electromotor(e), motor(m), sistem_directie(sd)
{

}
嗯…sistem_pornire的类型是什么?看看代码,我们看到它声明为:

SistemPornire sistem_pornire;
仅仅看到这一点就足以解释为什么虚拟函数无法工作。
sistem\u pornire
的类型在编译时已知,并且没有虚拟分派。请记住,只有通过指针调用虚拟函数(即,必须使用
->
运算符)时才会发生虚拟函数

但是让我们再深入一点

因此,构造函数引用一个
SistemPornire
实例,并使用它初始化
SistemPornire
自动旅游
中的
SistemPornire
成员的实例。换句话说,使用
SistemPornireCuPreincalzire的
SistemPornire
部分复制构建
SistemPornire
对象de>您在
main
中声明

从不调用和使用
main
中的对象

<>你应该仔细阅读C++中的调度和./p>
祝你好运!

我猜是对象切片。如果没有调用代码,我无法确定。你能构造一个演示该问题的函数吗?显示主函数。你能告诉我们如何声明对象并调用
pornire\u motor()吗
function?切片发生在自动旅游构造中,也有切片,但这不是问题所在。@NikBougalis为什么切片不是问题所在?抱歉,我的意思是键入唯一的问题。即使消除切片,也没有虚拟调度,因为没有通过指针的调用。
Autoturism::Autoturism(SistemPornire &sp, Electromotor&e, 
                       Motor&m, SistemDirectie&sd)
    : sistem_pornire(sp), electromotor(e), motor(m), sistem_directie(sd)
{

}
SistemPornire sistem_pornire;