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;