我有这段代码:
#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";
}
答案 0 :(得分:3)
有没有理由不这样做?
这是多余的。
如果基类中的方法声明为virtual
,则此虚拟化将由重写方法“继承”。
除此之外,可能出于文档目的,可能可以接受。但是,请记住,最好的虚拟机是私有,使用non-virtual interface成语。
完成后,由于私有方法不需要公开文档,“for documentation”原因就会落空,
答案 1 :(得分:0)
是的,当你不希望派生类因某种原因覆盖meth()的实现时。
如果您认为派生类可能需要更改meth()的实现,请将该方法设为虚拟。