从一开始,C ++中很少有像虚拟函数这样的概念一直在玩。我已经阅读了一些虚函数的语法,但我永远无法理解 -
有人可以解释宣布以下函数的内容吗?
void MakeMeASandwich();
virtual void MakeMeASandwich();
virtual void MakeMeASandwich() = 0;
答案 0 :(得分:9)
#include <iostream>
class A {
public:
void Y() { std::cout << "A" << std::endl; }
virtual void X() { std::cout << "A" << std::endl; }
};
class B : public A {
public:
void Y() { std::cout << "B" << std::endl; }
virtual void X() { std::cout << "B" << std::endl; }
};
int main() {
A a;
a.Y(); // "A"
a.X(); // "A"
B b;
b.Y(); // "B"
b.X(); // "B"
A* ap = &b;
ap->Y(); // "A"
ap->X(); // "B"
}
如果你没有进行多态化和派生,虚函数就不那么有趣了。如您所见,在第三种情况下,通过类型为A*
的指针访问B的实例。对于非虚函数,这意味着调用的函数实际上是在A
中定义的,而不是在B
中定义的。使用表解析虚函数调用,因此代码在运行时确定跳转的位置。
问题:
1)在运行时确定要调用的函数,具体取决于对象的 real 类型。
2)多态
3)否,如果不是ap->X()
,则A::X()
会调用virtual
。
4)很高兴:
void MakeMeASandwich();
默认,没什么特别的。
virtual void MakeMeASandwich();
虚拟函数,提供实现。派生类可以选择覆盖它。
virtuall void MakeMeASandwich() = 0;
声明了一个虚函数,但没有提供任何实现。包含此函数的类自动设置为abstract
,无法实例化。