C++ 我是否只需要基类中的虚拟机?

C++ 我是否只需要基类中的虚拟机?,c++,C++,我有一些从派生类进一步派生的类,例如: class A { public: virtual void doSomething() {} virtual ~A{} }; class B : public A { //...something... void doSomething() {} } class C : public B { //...something... void doSomething() {} } class D : pub

我有一些从派生类进一步派生的类,例如:

class A
{
public:
    virtual void doSomething() {}
    virtual ~A{}
};

class B : public A
{
    //...something...
    void doSomething() {}
}

class C : public B
{
    //...something...
    void doSomething() {}
}

class D : public B, public C
{
    //...something...
    void doSomething() {}
}
我的问题如标题所述:我是否只需要基类中的虚拟函数,而不管我如何使用它们

例如:

A *p = new B
delete p;

B *p2 = new C
delete p2;

如果重写的成员函数在父类中声明为虚拟,则它们是虚拟的。 这意味着在你的情况下

class C : public B
{
  //...something...
  void doSomething() {}
};
相当于

class C : public B
{
  //...something...
  virtual void doSomething() {}
};
但第二种选择更加明确,隐藏的意义更少


由于c++11,更好的选择是:

class C : public B
{
  //...something...
  void doSomething() override {}
};
此外,为了清楚地显示您的意图,编译器不会编译基类和派生类的函数签名不匹配的代码



但是,请确保在所有继承的类中使用虚拟析构函数。

您应该澄清“需要虚拟函数”的含义,因为这没有什么意义。我提供了一个如何使用它们的示例。我鼓励使用
void doSomething()override{}
。@Alex Done,因为C++没有C++ C++ 11,所以我不确定是否应该包含它,但是我们几乎在2015…我个人的观点是,只要C++还没有C++版本11,就应该鼓励C++上的C++ 11版本。但是在C++03中,我是否只需要在基类中使用用户定义的虚函数,在所有继承的类中使用虚析构函数?@user963241是的,但是如果您在任何地方重复这个关键字,您将来都会感谢自己。并将虚拟析构函数放在每个要从中继承的类上。