C++ 从派生作用域调用函数

C++ 从派生作用域调用函数,c++,inheritance,c++11,scope,C++,Inheritance,C++11,Scope,我有一些代码似乎与此类似: #include <iostream> class Base { public: void test() { std::cout << "Base::test()" << std::endl; } void test2() { test(); } }; class Derived : public Base { public: void test() {

我有一些代码似乎与此类似:

#include <iostream>

class Base {
public:
    void test() {
        std::cout << "Base::test()" << std::endl; 
    }

    void test2() {
        test();
    }
};

class Derived : public Base {
public:
    void test() {
        std::cout << "Derived::test()" << std::endl;
    }
};

int main() {
    Derived d;
    d.test2();
    return 0;
}
#包括
阶级基础{
公众:
无效测试(){

std::cout您可以使用所谓的奇怪循环类型模式(CRTP),并将
Base
作为类模板:


下面是一个。

您可以使用所谓的奇怪循环类型模式(CRTP),并将
Base
作为类模板:



这里有一个。

如果我理解你的意思,你希望d.test2()直接调用d.test(),对吗?据我所知,没有虚拟函数是无法做到这一点的。它们的目的正是为了这种情况。是的,没有重载
Base::test2()
,无需对派生的
使用不同的符号,也无需损失性能(例如,虚拟函数调用)。是否允许修改
?@Tim您是否确实验证了虚拟函数调用可测量地影响性能?@Tim这正是“过早优化”的含义。通常,您认为瓶颈可能出现的地方并不是实际出现的地方。如果您担心性能,请先编写未经优化的代码,然后对其进行度量,然后优化实际上会降低速度的部分。如果我理解正确,您希望d.test2()直接调用d.test(),对吗?据我所知,没有虚拟函数是无法做到这一点的。它们的用途正是针对这种情况。是的,没有重载
Base::test2()
,没有对
派生的
使用不同的表示法,也没有性能损失(例如虚拟函数调用)。是否允许您修改
Base
?@Tim您是否确实验证了虚拟函数调用可测量地影响此处的性能?@Tim这正是“过早优化”的含义。通常情况下,你认为瓶颈可能出现的地方并不是它实际会出现的地方。如果你担心性能,首先在没有优化的情况下编写代码,然后对其进行测量,然后优化那些实际上让你慢下来的部分。然后他必须检查哪一个更快—强制转换还是虚拟函数调用。@KamenStoykov the cast could在构造函数中完成。@AndyProwl这是一个很好的解决方案,但我认为我没有足够的能力将
Base
的继承类型更改为模板类
Base
。一些派生类已经实现了。@Tim:我明白了。那么我真的不相信除了使用虚拟函数之外还有其他方法。@AndyProwl感谢嗯。存储虚拟功能不会导致任何性能损失,对吗?@Tim:你说的“存储虚拟功能”是什么意思?然后他必须检查哪一个更快-强制转换或虚拟函数调用。@KamenStoykov强制转换可以在构造函数中完成。@AndyProwl这是一个很好的解决方案,但我认为我没有足够的能力将
Base
的继承类型更改为模板类
Base
。一些派生类已经实现了。@Tim:I看。那么我真的不相信除了使用虚拟函数之外还有别的方法。@AndyProwl谢谢。存储虚拟函数不会导致任何性能损失,对吗?@Tim:你说的“存储虚拟函数”是什么意思?
template<typename D>
class Base {
public:
    void test() {
        std::cout << "Base::test()" << std::endl;
    }

    void test2() {
        (static_cast<D*>(this))->test();
    }
};
class Derived : public Base<Derived> {
//                     ^^^^^^^^^^^^^
//                     This is the only change required in Derived
public:
    void test() {
        std::cout << "Derived::test()" << std::endl;
    }
};