c++ - 使用具有相同成员函数名称的 CRTP

标签 c++ inheritance crtp

当我看到使用的 CRTP 模式时,似乎在基类型中调用的函数名总是指向派生类型中不同名称的实现函数(例如:foo() 在基类中调用 static_cast<DerivedType*>(this)->foo_implementation(); .

有没有办法使用相同的函数名来实现 CRTP 模式?我有一个较长的继承链,其中函数在链的第一级可能没有具体实现,因此必须使用不同的函数名称不是很清晰/可读。

我想要如下内容:

template <typename SecondType>
struct FirstType {

    void foo() {
        static_cast<SecondType*>(this)->foo();
    }

};

template <typename ThirdType>
struct SecondType : FirstType<SecondType> {

    void foo() {
        static_cast<ThirdType*>(this)->foo();
    }

};

struct ThirdType : SecondType<ThirdType> {

    void foo() {
        // Concrete implementation here
    }

};

当然编译器不会提示这个,但我想它会导致隐式 vtable 查找(尽管 virtual 关键字没有出现),违背了使用 CRTP 的目的。

最佳答案

你可以很好地为两个函数使用相同的名称,它会工作得很好。

使用不同名称的好处是,在派生类中未能实现函数将导致编译器错误,而不是在运行时无限递归和可能的堆栈溢出。

关于c++ - 使用具有相同成员函数名称的 CRTP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46799848/

相关文章:

C++ getline() 函数没有按预期工作

java - 在Java中模拟构造函数重写?

java - 为什么我允许 "direct access"到对象的 protected 字段,该对象的类是在不同的包中定义的?

c++ - CRTP 编译,但我不希望它编译。如何?

c++ - 您可以在 CRTP 方法中对派生类使用约束吗?

c++ - CRTP 和默认赋值运算符

c++ - 从字符串中读取/解析多个 INT

C++ 函数 "Automatic"返回值?

即使经过长时间等待,C++ 线程也不会加入

c++ - 为什么成员函数名查找停留在父类中?