C ++ - 条件虚函数

时间:2016-03-30 20:52:39

标签: c++ class virtual

我的问题是,如果我有类似

的话
class Base {
 ...
 public:
  virtual void func();
}

void Base::func() {
 //Implementation # 1
}

class Derived1 : public Base {
 ...
 public:
  void func();
}

void Derived1::func() {
 //Implementation # 1
}

class Derived2 : public Base {
 ...
 public:
  void func();
}

void Derived2::func()
 //Implementation # 1
}

class Derived3 : public Base {
 ...
 public:
  void func();
}

void Derived3::func() {
 //Implementation # 2
}

我想要做的是我希望Derived1和Derived2使用Base中使用的func()的实现,但是我希望Derived3稍微使用func()。问题是,如果我在Base中使用func()虚拟,那么Derived1和Derived2都需要以不同的方式实现它,这是我不想要的。但是,如果我不使它成为虚拟,那么所有派生类将具有相同的植入func()。我怎样才能解决这个问题?

4 个答案:

答案 0 :(得分:6)

虚拟函数不能覆盖Derived1Derived2无法重新声明func()

只有纯虚拟函数(用= 0声明)必须被(非抽象)派生类覆盖。

答案 1 :(得分:1)

修改

这样可行,但除非你需要在函数中完成更多的工作,否则@ Cameron的答案是正确的。

您可以从派生函数调用基函数,如下所示:

class Base
{
public:
   virtual void foo() { /* Do something */ };
};

class Derived1 : public Base
{
public:
   virtual void foo() { /* Do something else */ };
};

class Derived2 : public Base
{
public:
   virtual void foo() { Base::foo(); /* Do something */ };
};

答案 2 :(得分:1)

你有没有想过只在derived1中定义为虚拟函数?

下面的代码就像那样(你想要的是什么?)

#include <stdio.h>
#define X


class Base {

 public:
  void func();
};


void Base::func() {
    printf("Base\n");
}

class Derived1 : public Base {
 public:
  virtual void func();
};

void Derived1::func() { 
    printf("derived1\n"); 
};

class Derived2 : public Base {
 public:
};

class Derived3 : public Base {
 public:
};

int main(int argc, char **argv)
{
    Base b;
    Derived1 d1;
    Derived2 d2;
    Derived3 d3;

    b.func();
    d1.func();
    d2.func();
    d3.func();

    printf("hello world\n");
    return 0;
}

答案 3 :(得分:0)

只需调用Derived1的func()和Derived2,就像这样调用Base func()

Base::func();

Derived3 func()可以有不同的实现。