从一开始,C++ 中的一些概念(例如虚函数)就一直在我的脑海中玩耍。我已经阅读了一些虚函数的语法,但我永远无法理解 -
- 虚函数有什么作用
- 为什么使用它们?我的意思是实际上
- 为什么我们需要它们?我们不能用普通函数代替吗?
任何人都可以解释声明以下函数的用途吗?
void MakeMeASandwich(); virtual void MakeMeASandwich(); virtual void MakeMeASandwich() = 0;
从一开始,C++ 中的一些概念(例如虚函数)就一直在我的脑海中玩耍。我已经阅读了一些虚函数的语法,但我永远无法理解 -
任何人都可以解释声明以下函数的用途吗?
void MakeMeASandwich();
virtual void MakeMeASandwich();
virtual void MakeMeASandwich() = 0;
#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"
}
如果您不喜欢多态和派生,那么虚函数就没那么有趣了。如您所见,在第三种情况下, B 的实例是通过 type 的指针访问的A*
。对于非虚函数,这意味着调用的函数实际上是在 中定义的A
,而不是在 中B
。虚函数调用是用一张表来解析的,所以运行时的代码决定了跳转到哪里。
对于您的问题:
1) 根据对象的真实类型,在运行时确定调用哪个函数。
2) 多态性
3) 不,ap->X()
如果A::X()
不是因为virtual
.
4) 高兴地:
void MakeMeASandwich();
默认,没什么特别的。
virtual void MakeMeASandwich();
一个虚函数,提供一个实现。派生类可以选择覆盖它。
virtuall void MakeMeASandwich() = 0;
声明了一个虚函数,但没有提供实现。包含该函数的类被自动设置为abstract
不能实例化。