首先,我来自Java社区,仍然是C ++的学习者。
请查看以下课程
第二张图显示了“GameObject”类的子类。它还有一个Display()
方法。 GameObject类有5个子类,它们都有这个Display()
方法。那么,GameObject
中的这种显示方法是虚拟的吗?
我认为它不是抽象虚拟(100%虚拟),因为Display()
中的GameObject
会在GameObject.cpp
中显示一些文字
无论如何,我不太确定。请帮忙!
答案 0 :(得分:2)
在C ++中,当且仅当已经在基类或类本身中显式声明虚拟时,虚函数才是虚拟的。由于GameObject似乎没有基类,GameObject::Display()
必须被声明为虚拟,如果显示GameObject引用(或指针)应该根据该引用后面的对象的实际(即运行时)类型进行操作。
在GameObject.cpp中拥有一个函数体并不意味着该函数不是纯虚函数(java的抽象的C ++等价物)。您可以通过在其声明中添加= 0
来使该函数成为纯虚函数。不过,您可以为纯虚方法提供实现,例如有一个默认实现,您在实现该方法的派生类中显式调用:
class GameObject {
//...
public:
virtual void Display() = 0;
};
//GameObject.cpp
void GameObject::Display() {
/* do something */
}
//DerivedGO.h
class DerivedGO : public GameObject {
public:
// virtual can be left out here, since it's declared virtual in the base class
virtual void Display() {
prepDisplay(); // do some preparation
GameObject::Display(); //call the original/default implementation
}
};
但是请注意,使函数纯虚拟意味着使包含类成为抽象,并且每个派生类也不会覆盖其基类中的所有纯虚函数。