- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
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/
我有一个特别的问题想要解决,我不确定是否可行,因为我找不到任何信息或正在完成的示例。基本上,我有: class ParentObject {}; class DerivedObject : publi
在我们的项目中,我们配置了虚 URL,以便用户可以在地址栏中输入虚 URL,这会将他们重定向到原始 URL。 例如: 如果用户输入'http://www.abc.com/partner ',它会将它们
我是一名优秀的程序员,十分优秀!