gpt4 book ai didi

c++ - 如何停止隐式转换为虚函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:09:00 25 4
gpt4 key购买 nike

struct A{
virtual void fun(){cout<<"A";}
};
struct B:public A{
void fun(){cout<<"B";}
};
struct C:public B{
void fun(){cout<<"C";}
};
int main()
{
C c;B b1;
A *a=&b1;
a->fun(); //1
B *b=&c;
b->fun(); //2
return 0;
}

在上面的代码中,B::fun() 被隐式转换为虚函数,因为我已经将 A::fun() 设为虚函数。我可以停止这种转换吗?

如果不可能,有什么替代方法可以使上述代码打印“BB”?

最佳答案

虚函数在所有派生类中都是虚的。没有办法阻止这种情况。

(§10.3/2 C++11) If a virtual member function vf is declared in a class Base and in a class Derived, derived directly or indirectly from Base, a member function vf with the same name, parameter-type-list (8.3.5), cv-qualification, and ref-qualifier (or absence of same) as Base::vf is declared, then Derived::vf is also virtual (whether or not it is so declared) and it overrides Base::vf. For convenience we say that any virtual function overrides itself.

但是,如果您想使用对应于静态 而非动态 指针类型的函数(即,在您的示例中, B::fun 而不是 C::fun,假设指针声明为 B*),那么至少在C++11,使用下面的别名定义来访问静态(=编译时)类型:

template <typename Ptr>
using static_type = typename std::remove_pointer<Ptr>::type;

这就是您在 main()(或其他任何地方)中使用它的方式:

int main() 
{
C c; B b1;

A *a = &b1;
a->fun();

B *b = &c;

/* This will output 'B': */
b->static_type<decltype(b)>::fun();

return 0;
}

关于c++ - 如何停止隐式转换为虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17418057/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com