虚函数关键字
Virtual function keyword
在子类中声明带有"virtual"关键字或不带有的继承虚函数有什么区别吗?考虑到我想调用适合我对象类型的fun。看看评论。
#include <cstdio>
struct A{
int a;
A():a(5){}
virtual int fun(){return a+1;}
};
struct B: public A{
virtual int fun(){return a+5;} //I put virtual here
// int fun(){return a+5;} // Any difference if I put virtual before or not?
};
int main(){
B obj;
printf("%dn", static_cast<A>(obj).fun()); // A::fun() called. Why?
printf("%dn", static_cast<A&>(obj).fun()); // B::fun() called. As expected
printf("%dn", static_cast<A*>(&obj)->fun()); // B::fun() called. As expected
printf("%dn", static_cast<A>(B()).fun()); // A::fun() again. Why?
// printf("%dn", static_cast<A&>(B()).fun()); //invalid_cast error. Why?
printf("%dn", static_cast<A*>(&B())->fun()); //It works! B::fun() call
return 0;
}
如果基类中的相应函数为虚函数,则派生类中的重写函数隐式声明为"virtual"。只要确保您获得了完全相同的签名,否则您可能会无意中隐藏原始函数并声明一个新函数!
在c++ 0x中,可以自由使用override
说明符。
你的两个"为什么"问题是因为切片;您正在创建类型为A
的新的复制切片对象。注意,在B x; static_cast<A>(x);
中,转换与说A(x)
相同。
在派生类中重写的成员函数之前保留virtual关键字是可选的。运行时多态性只适用于指针或引用。
相关文章:
- 如何确保C++函数在定义之前声明(如override关键字)
- C++函数的关键字?
- 应用于运算符而不是构造函数的显式关键字
- 如何通过 boost::p ython 重命名构造函数的关键字参数
- 是否建议在函数中使用using关键字
- C++ 如何将关键字"friend"与两个类的成员函数一起使用 相互包含
- 为什么 c++ 使用 throw() 关键字来指示函数不会引发任何异常
- 统一内存分配库的函数关键字
- 如何使用 "using" 关键字定义函数原型/签名
- 在 new 关键字中,由默认构造函数初始化的类中的元素是否也使用 new 关键字在C++?
- C++带有 using 关键字和参数包的模板函数
- 如何在 C++ 的 lambda 函数中传递同名的局部变量和参数(使用此关键字)?
- g++ 6.3,avx 内联函数上的 Kahan 求和用易失性关键字进行序列化
- ELI5 函数名称后面的"&&"关键字是什么意思
- 为什么静态成员函数定义不能有关键字"static"?
- 带有 "this" 关键字的 Java Copy 构造函数
- C++不使用"inline"或"static"无类函数的关键字时出现重定义链接错误
- 为什么带有 const 关键字的构造函数可以工作,而没有它就不能工作?
- 将 final 关键字添加到没有基类(未派生)的类中的虚函数是否有意义
- 当没有显式关键字与单参数构造函数一起使用时,编译器可以发出警告