首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++条件虚函数

C++条件虚函数
EN

Stack Overflow用户
提问于 2016-03-31 04:52:39
回答 4查看 264关注 0票数 0

我的问题是,如果我有这样的东西

代码语言:javascript
复制
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()植入。我怎样才能克服这个问题呢?

EN

回答 4

Stack Overflow用户

发布于 2016-03-31 04:56:21

虚函数不必被重写。Derived1Derived2不能重新声明func()

只有纯虚函数(用= 0声明)才能被(非抽象的)派生类覆盖。

票数 6
EN

Stack Overflow用户

发布于 2016-03-31 04:55:14

编辑

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

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

代码语言:javascript
复制
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 */ };
};
票数 1
EN

Stack Overflow用户

发布于 2016-03-31 05:18:35

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

下面的代码是这样工作的(这是您想要的吗?)

代码语言:javascript
复制
#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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36319479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档