派生类中的方法在引用的类中没有 *virtual* 关键字的情况下执行
method in the derived class got executed without a *virtual* keyword in the referred class
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;
}
我预计输出为"在总线驱动中">,但输出是"在超级跑车中"。如果 virtual 关键字与总线类中的驱动器方法相关联,则输出肯定应该在总线驱动器中。我知道我们已经继承了车辆类,但我们仍然只为总线类创建了指针。有人可以帮我为什么车辆类中的虚拟关键字会影响公交车类的方法,我在哪里错过了重点?
virtual
关键字是一个说明符,表示应通过动态调度调用函数。它不需要在每个派生类中重复;一旦成员函数是虚拟的,它在每个派生类中都是虚拟的。
通过动态调度调用的版本是覆盖它的派生类中的版本。所以在你的例子中,b
指向的对象的动态类型是supervehicle
,所以调用的函数是supervehicle::drive
,而不是bus::drive
。
C++标准2011年修订版中的相关说明符是override
。您应该在重写的函数上使用它,让编译器知道您正在尝试重写虚拟函数。如果在函数原型中出错,编译器将发出诊断。
相关文章:
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- C++中的"inline"关键字
- 如何确保C++函数在定义之前声明(如override关键字)
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 谷歌模拟和覆盖关键字
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 为什么"delete"关键字不删除节点?
- 多重继承:跳过'virtual'关键字并拒绝菱形层次结构的使用?
- C++ "virtual"关键字放置
- 派生类中的方法在引用的类中没有 *virtual* 关键字的情况下执行
- C++中“virtual”关键字在对象而不是指针上的行为
- 关键字是否"virtual"传递给中间基类?
- 视觉 是否可以覆盖子类中的函数C++而无需对抽象的父类中的函数使用 virtual 关键字
- 从constexpr函数返回一个类需要使用g++的virtual关键字
- 使用'virtual'和'override'关键字声明重写的方法是好还是坏?
- Virtual 关键字使派生对象中的方法无法访问
- "virtual"关键字在C++的基类中是可选的吗?
- 使用关键字和不带关键字覆盖函数"virtual"