C++:在继承层次结构中的每个类中使用virtual

C++: Use virtual in every class in the inheritance hierarchy?

本文关键字:virtual 继承 层次结构 C++      更新时间:2023-10-16

我有这个代码:

#include <iostream>
using namespace std;
class FooA {
    public:
    virtual void meth () {cout << "hiAn";}
};
class FooB : public FooA{
    public:
    void meth () {cout << "hiBn";}
};
class FooC : public FooB {
    public:
    void meth () {cout << "hiCn";}
};
int main() {
    FooA a;
    a.meth();
    FooB b;
    b.meth();
    FooC c;
    c.meth();
    FooA* ptr = &a;
    ptr->meth();
    ptr = &b;
    ptr->meth();
    ptr = &c;
    ptr->meth();
    FooB* ptrB = &b;
    ptrB->meth();
    ptrB = &c;
    ptrB->meth();
}

输出是这样的:

hiA
hiB
hiC
hiA
hiB
hiC
hiB
hiC

该代码是基本的、不言自明的。我尝试了在每个类中使meth()成为虚拟或非虚拟的不同组合。显然,这将改变输出的方式,尤其是在FooA::meth()未声明为虚拟的情况下。我得出的结论是,让该方法的每个实例都是虚拟的可能是最好和最清楚的。有什么理由不这样做吗?

编辑:我还有一个问题。当您声明一个类,然后在类声明之外定义它时,使用:

像这个

class Foo{
public:
virtual void bar();
};
void Foo::bar {
cout << "Hello";
}

为什么我不能做之类的事情

virtual void Foo::bar {
cout << "Hello";
}

有什么理由不这样做吗?

这是多余的。

如果基类中有一个方法声明为virtual,那么这个虚拟性将被重写方法"继承"。

除此之外,出于文档目的,可能是可以接受的。但是,请记住,最好的虚拟机是private,使用非虚拟接口习惯用法。

这样一来,"用于文档"的理由就落到了实处,因为私有方法不需要公共文档。

是的,当您出于某种原因不希望派生类覆盖meth()的实现时。

如果您认为派生类可能需要更改meth()的实现,请将该方法设为虚拟方法。