我试图了解应该在何时/何处编写“virtual”关键字,以便给定类的任何后代启用多态行为,因为我在其他地方找不到有关此问题的具体信息。
对于我所尝试的,在基类中的函数上使用 virtual 会自动使该函数对于任何后代都是虚拟的。然而,互联网上的许多片段经常在后代中再次声明这些函数是虚拟的。
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 关键字只是为了清晰起见和 self 文档化,还是有其他我不知道的效果?
最佳答案
对于我所尝试的,在基类中的函数上使用 virtual 会自动使该函数对于任何后代都是虚拟的。
确实如此,子方法自动继承父方法的虚拟
特性。
人们在子类中重述virtual
作为一种约定,只是为了明确表明子类打算重写虚拟方法(尽管我们在C++11中有override
) .
关于c++ - 派生类中何时实际需要 "virtual"属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21339089/