我只需要基类中的虚拟机吗?

时间:2014-12-17 09:50:18

标签: 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 : public B, public C
{
    //...something...
    void doSomething() {}
}

我的问题如标题所述:无论我如何使用它,我是否只需要基类中的虚函数?

例如:

A *p = new B
delete p;

B *p2 = new C
delete p2;

2 个答案:

答案 0 :(得分:5)

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

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

除了清楚地表明你的意图之外,编译器不会编译基类和派生类的函数签名不匹配的代码。


请务必在所有继承的类中使用虚拟析构函数。

答案 1 :(得分:-2)

回答你的问题:

  • 不,你也需要在派生类中添加virtual,如果你想要像你一样派生它们。

很少评论:

1-这个class D : public B, public C在你的例子中没有任何意义。

2-你确定你不必虚拟地得出这两个(假设有意义推导出来)?

你可以提供一个例子或问题吗?所以我们可以更好地解决。