【发布时间】:2014-01-24 17:47:20
【问题描述】:
我试图了解何时/何地应该编写“虚拟”关键字,以便给定类的任何后代启用多态行为,因为我无法在其他地方找到有关此问题的具体信息。
对于我所尝试的,在基类中的函数上使用 virtual 会自动使该函数对于任何后代都是虚拟的。然而互联网上的许多sn-ps经常在后代中再次声明这些功能是虚拟的。
struct A {
virtual void foo1() { std::cout << "[A] foo1.\n"; }
virtual void foo2() { std::cout << "[A] foo2.\n"; }
};
struct B : public A {
virtual void foo1() { std::cout << "[B] foo1.\n"; }
void foo2() { std::cout << "[B] foo2.\n"; }
};
用 g++ 编译这段代码,我发现 foo1 和 foo2 都具有多态行为。此外,即使我再次从 B 派生并创建一个 C 类,并且在没有 virtual 关键字的情况下再次实现 foo2,foo2 仍然使用 v-table。
在派生类中使用 virtual 关键字只是为了清晰和自我说明,还是有一些我不知道的其他影响?
【问题讨论】:
-
派生类中的虚拟只是提供信息
-
拥抱 C++11 override 关键字。它修复了由这种行为引起的许多令人讨厌的维护错误。