我的问题是,如果我有类似
的话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()。我怎样才能解决这个问题?
答案 0 :(得分:6)
虚拟函数不能覆盖。 Derived1
和Derived2
无法重新声明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()可以有不同的实现。