gpt4 book ai didi

c++ - C++ 是否允许多级虚拟化?

转载 作者:可可西里 更新时间:2023-11-01 18:17:56 26 4
gpt4 key购买 nike

我有一个名为 Object 的基类。 PhysicsObject 继承自 Object。 Ball继承自PhysicsObject,SoftBall继承自Ball。像这样:

Object
|
PhysicsObject
|
Ball
|
SoftBall

我有一个名为 foo() 的方法,它在 Object 中声明为虚拟(给定一个实现,所以不是纯虚拟),然后在 PhysicsObject 和 Ball 中再次声明并实现为虚拟。最后,SoftBall 再次实现了 foo(),但没有将其声明为虚拟的。

如果我有一个指向 SoftBall 的 Object*,SoftBall 版本的 foo() 会被调用吗?如果没有,有什么办法可以达到这种效果吗?基本上,多态性的这一方面是否仍然适用于不止一个继承级别?

最佳答案

如果您在基类中声明一个虚函数,并在派生类中声明一个具有相同签名的函数,它会自动变为虚函数(即使在任何层数的类中)之间)。所以你的问题的答案是,是的,将调用 foo() 的 SoftBall 实现。

但是请注意,如果签名有任何不同,那么虚函数将被隐藏。例如:

class Object {
public:
virtual void foo();
};

class InBetween : public Object {
// assume it has no foo()s
};

class A : public InBetween {
public:
void foo() const; // DOES NOT OVERRIDE; ((Object *)pA)->foo() calls Object::foo()
// However pA->foo() calls this
};

class B: public InBetween {
public:
void foo() const; // Does not override; pB->foo() calls this if pB is const
void foo(); // Does override; ((Object *)pB)->foo() calls this. pB->foo() also calls this if pB is non-const
};

关于c++ - C++ 是否允许多级虚拟化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7151790/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com