C++ 派生类中的方法在引用的类中没有*virtual*关键字的情况下执行 class车辆 { 公众: 虚拟空驱动器() { cout
virtual关键字是一个说明符,表示应该通过动态分派调用函数。它不需要在每个派生类中重复;一旦成员函数是虚拟的,它在每个派生类中都是虚拟的 通过动态分派调用的是覆盖它的最派生类的版本。因此在您的例子中,C++ 派生类中的方法在引用的类中没有*virtual*关键字的情况下执行 class车辆 { 公众: 虚拟空驱动器() { cout,c++,overriding,virtual-functions,C++,Overriding,Virtual Functions,virtual关键字是一个说明符,表示应该通过动态分派调用函数。它不需要在每个派生类中重复;一旦成员函数是虚拟的,它在每个派生类中都是虚拟的 通过动态分派调用的是覆盖它的最派生类的版本。因此在您的例子中,b指向的对象的动态类型是supervehicle,因此调用的函数是supervehicle::drive,而不是bus::drive 一个相关的说明符,在C++标准的2011次修订中是“代码>覆盖/ 。您应该在重写函数上使用它,让编译器知道您试图重写虚拟函数。如果您在函数原型中出错,编译器将发出
b
指向的对象的动态类型是supervehicle
,因此调用的函数是supervehicle::drive
,而不是bus::drive
一个相关的说明符,在C++标准的2011次修订中是“代码>覆盖/ <代码>。您应该在重写函数上使用它,让编译器知道您试图重写虚拟函数。如果您在函数原型中出错,编译器将发出诊断。
< p> <代码>虚拟< /Cord>关键字是表示应该通过动态分派调用函数的说明符。它不需要在每个派生类中重复;一旦成员函数是虚拟的,它在每个派生类中都是虚拟的 通过动态分派调用的是覆盖它的最派生类的版本。因此在您的例子中,b
指向的对象的动态类型是supervehicle
,因此调用的函数是supervehicle::drive
,而不是bus::drive
<> >一个相关的说明符,在C++标准的2011次修订中是“代码>重写< /Cord>”。应该在重写函数上使用它,让编译器知道你试图重写虚拟函数。如果你在函数原型中犯了一个错误,编译器会发出一个诊断。。这与虚拟I无关。n正确性。不正确,但
bus*b;b=new supervehicle();
应该是bus*b=new supervehicle();
。在创建变量时养成初始化变量的习惯。谢谢。我会记住这一点。这与虚拟继承无关。不正确,但bus*b;b=new supervehicle()
应该是bus*b=new supervehicle();
。在创建变量时要养成初始化变量的习惯。谢谢。我会记住这一点。
class vehicle
{
public:
virtual void drive()
{
cout<<"in vehicle drive"<<endl;
}
};
class bus:public vehicle
{
public:
void drive()
{
cout<<"in bus drive"<<endl;
}
};
class supervehicle:public bus
{
public:
void drive()
{
cout<<"in supervehicle"<<endl;
}
};
int main()
{
bus *b;
b=new supervehicle();
b->drive();
return 0;
}