我可以判断是否实现了 C++ 虚函数吗
Can I tell if a C++ virtual function is implemented
我希望能够在 运行 时判断 class 的实例是否实现了虚函数。例如:
struct Base
{
virtual void func(int x) { <default behavior here> }
virtual void func2(int x) { <default behavior here> }
};
struct Deriv : Base
{
virtual void func(int x) override { <new behavior here> }
};
int main()
{
Base *d = new Deriv;
if(implements<Base::func(int)>(d)) // This should evaluate true
{}
if(implements<Base::func2(int)>(d)) // This should evaluate false
{}
}
我看过这个,但是它已经过时了,c++11/14 现在可能有一些话要说:
Ways to detect whether a C++ virtual function has been redefined in a derived class
我现在想到的是有一个特殊的 "counter" 变量,它将根据实现取值,如果调用 base-class 函数则取零。我认为这听起来有点过时,稍后会尝试找到更好的解决方案。现在看例子:
struct Base
{
virtual void func(int x, int& implemented) {implemented = 0;}
};
struct Deriv : Base
{
virtual void func(int x, int& implemented) override {implemented = 1;}
};
如果函数在您的示例中是无效的,您也可以使用 "return codes" - 只需返回 return 实现的值。
简短的回答是:不。而且肯定不是以可移植的方式。
更长的答案:实际上,多态性的真正目标是让用户无法区分功能的来源。
即使开发人员不编写代码,编译器仍可能为派生的 class 生成函数的专用版本(以便更好地优化)。这甚至会抛出检查虚拟表的非便携式实现...
但是,另一种方法是放弃 C++ 自动 运行 时间多态性,而是提供一个临时实现。例如,如果您要提供自己的虚拟 table/pointer 机制,那么您将拥有更多控制权:
struct VirtualTable {
typedef void (*FuncType)(void*, int);
typedef void (*Func2Type)(void*, int);
FuncType func;
Func2Type func2;
};
你可以检查函数指针是否等于默认值。
我希望能够在 运行 时判断 class 的实例是否实现了虚函数。例如:
struct Base
{
virtual void func(int x) { <default behavior here> }
virtual void func2(int x) { <default behavior here> }
};
struct Deriv : Base
{
virtual void func(int x) override { <new behavior here> }
};
int main()
{
Base *d = new Deriv;
if(implements<Base::func(int)>(d)) // This should evaluate true
{}
if(implements<Base::func2(int)>(d)) // This should evaluate false
{}
}
我看过这个,但是它已经过时了,c++11/14 现在可能有一些话要说: Ways to detect whether a C++ virtual function has been redefined in a derived class
我现在想到的是有一个特殊的 "counter" 变量,它将根据实现取值,如果调用 base-class 函数则取零。我认为这听起来有点过时,稍后会尝试找到更好的解决方案。现在看例子:
struct Base
{
virtual void func(int x, int& implemented) {implemented = 0;}
};
struct Deriv : Base
{
virtual void func(int x, int& implemented) override {implemented = 1;}
};
如果函数在您的示例中是无效的,您也可以使用 "return codes" - 只需返回 return 实现的值。
简短的回答是:不。而且肯定不是以可移植的方式。
更长的答案:实际上,多态性的真正目标是让用户无法区分功能的来源。
即使开发人员不编写代码,编译器仍可能为派生的 class 生成函数的专用版本(以便更好地优化)。这甚至会抛出检查虚拟表的非便携式实现...
但是,另一种方法是放弃 C++ 自动 运行 时间多态性,而是提供一个临时实现。例如,如果您要提供自己的虚拟 table/pointer 机制,那么您将拥有更多控制权:
struct VirtualTable {
typedef void (*FuncType)(void*, int);
typedef void (*Func2Type)(void*, int);
FuncType func;
Func2Type func2;
};
你可以检查函数指针是否等于默认值。