我一直在寻找一个基类和多个子类,每个子类都对许多共享函数中使用的一个函数进行单独的实现。这类似于
class A {
public:
int a() {
return 6;
}
int b() {
return a() - 2;
}
};
class B: public A {
public:
int a() {
return 10;
}
};
int main() {
B x;
std::cout << x.b() << std::endl;
}
我如何使x.b()
成为8
而不是4
?
答案 0 :(得分:2)
您需要使函数虚拟化,以便a()
始终引用对象的真实类中a()
的实现:
class A {
public:
virtual int a() { //<<<<<<<<--------
return 6;
}
int b() {
return a() - 2;
}
virtual ~A() = default;
};
在具有非虚拟功能的版本中,b()
的主体调用它知道的唯一a()
,即A::a()
。
作为一种好的实践,并且为了避免讨厌的错误,在定义虚拟函数时,请在派生类中指示您重写虚拟函数:
class B: public A {
public:
int a() override {
return 10;
}
};
另一个好的做法是预见基类中的虚拟析构函数。