【发布时间】:2019-11-28 11:07:35
【问题描述】:
有没有办法(模板、宏等)在编译时替换common方法对hidden_in_derived的调用,以便 Derived 的实例调用它自己的 hidden_in_derived(没有使 hidden_in_derived 在 Base 中虚拟) ?
#include <iostream>
class Base {
public:
void common() {
// some calls to other methods
hidden_in_derived();
// yet some calls to other methods
}
void hidden_in_derived() {
std::cout << "A" << std::endl;
}
};
class Derived : public Base {
public:
void hidden_in_derived() {
std::cout << "B" << std::endl;
}
};
int main() {
Derived d;
d.common(); // want hidden_in_derived (prints "B") here somehow ?
}
【问题讨论】:
-
没有虚拟化 - 这就是虚拟函数的全部意义。
-
您需要解决的实际问题是什么?为什么不能将
hidden_in_derived设为虚拟? -
如果
hidden_in_derived()不是Base的virtual函数,那么Base::common()需要手动算出对象this的ACTUAL类型。这是不可能的,除非Base携带一些为每个派生类唯一设置的信息,并且Base::common()的实现具有关于每个可能的派生类的信息,并且在派生新类时更新。做这一切的成本(以及由于忘记正确更新Base::common()而导致出错的可能性)意味着将hidden_in_derived()虚拟化会更容易。 -
您是否需要派生类实际上共享一个公共基础?如果您不这样做,CRTP 可能会起作用。示例:godbolt.org/z/xVcW2T
-
在我的示例中,没有每个碱基都是唯一的碱基,因此 Derived1 和 Derived2 会有不同的碱基。
标签: c++ inheritance compile-time member-hiding