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

时间:2012-02-22 17:00:39

标签: c++ inheritance virtual

我有这段代码:

#include <iostream>

using namespace std;

class FooA {
    public:
    virtual void meth () {cout << "hiA\n";}
};
class FooB : public FooA{
    public:
    void meth () {cout << "hiB\n";}
};
class FooC : public FooB {
    public:
    void meth () {cout << "hiC\n";}
};

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";
}

2 个答案:

答案 0 :(得分:3)

  

有没有理由不这样做?

这是多余的。

如果基类中的方法声明为virtual,则此虚拟化将由重写方法“继承”。

除此之外,可能出于文档目的,可能可以接受。但是,请记住,最好的虚拟机是私有,使用non-virtual interface成语。

完成后,由于私有方法不需要公开文档,“for documentation”原因就会落空,

答案 1 :(得分:0)

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

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