virtual
关键字的作用方面遇到了困难。我非常熟悉C和Java,但是对C++还不太了解。从维基百科上可以得知:
在面向对象编程中,虚函数或虚方法是一种函数或方法,其行为可以被一个具有相同签名的函数所覆盖(override)。
然而,我可以像下面这样重写一个方法,而不需要使用
virtual
关键字。#include <iostream>
using namespace std;
class A {
public:
int a();
};
int A::a() {
return 1;
}
class B : A {
public:
int a();
};
int B::a() {
return 2;
}
int main() {
B b;
cout << b.a() << endl;
return 0;
}
//output: 2
正如您在下面看到的那样,函数A::a被成功地覆盖为B::a,而不需要使用virtual关键字。
让我更加困惑的是维基百科上有关虚析构函数的这个声明:
正如以下示例所示,C++基类必须具有虚析构函数,以确保始终调用最派生类的析构函数。
所以,virtual还告诉编译器调用父类的析构函数吗?这似乎与我最初对virtual的理解“使函数可重写”的理解非常不同。
B obj; A* p = &obj;
或者A& ref = obj;
- Roger Pate