c++ - 派生类中何时实际需要 "virtual"属性?

标签 c++ virtual

我试图了解应该在何时/何处编写“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/

相关文章:

c++ - 将派生类对象分配给基类对象时会发生什么(我的意思是对象分配,而不是指针)

c++ - GCC 不会根据 SFINAE 规则禁用功能

c++ - lambda 类型推导失败

c++ - Qt 图表 - 如何在 x 和 y 轴上显示特定点值?

c++ - QAudioDecoder "GStreamer; Unable to start decoding process"

c++ - 对 vtable 的 undefined reference - 虚拟成员,由 gsoap 生成的类

c++ - 虚拟基类和初始化列表

c++ - 具有多个返回值和/或虚拟基类仿函数的 STL for_each

c++ - 错误 : out-of-line definition of 'test' does not match any declaration in 'B<dim>'

c++ - 为什么在 C 中直接将无符号转换为有符号会给出正确的结果?