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;
}
};