为什么使用虚函数而不是常规函数
Why use virtual function instead of regular?
在 c++ 中,基类中的虚函数可以在派生类中被覆盖。以及一个成员函数,其中特定的实现将取决于运行时调用它的对象的类型。
由于必须实现虚函数(纯虚函数除外)我可以在基类中使用常规函数并在派生类中重新定义它吗?如果是。使用虚函数有什么意义?
谢谢
您可以重新定义它,但它不会以多态方式工作。
所以如果我有一个
class base
{
int foo(){ return 3; }
};
class Der : public base
{
int foo() {return 5;}
};
然后有一个取基数的函数
void dostuff(base &b)
{
b.foo(); // This will call base.foo and return 3 no matter what
}
我这样称呼它
Der D;
dostuff(D);
现在,如果我将底座更改为
class base
{
virtual int foo(){ return 3; }
};
void dostuff(base &b)
{
b.foo(); // This will call the most derived version of foo
//which in this case will return 5
}
所以真正的答案是,如果你想编写通用代码,从基础调用正确的函数,它必须是虚拟的。
实际上,虚函数是面向对象语言的基础。在 java 中,所有函数都是虚函数。但在 c++ 中,虚函数比常规函数慢。因此,如果不需要函数覆盖,则应使用常规函数而不是虚拟函数。
相关文章:
- 是否可以使用单个定义定义函数的常量和常规版本?(使用模板,自动,decltype等)
- G++ 编译器是否在未使用返回值的情况下将 constexpr 函数视为常规函数?
- C++常规指针函数或模板
- 在C++中,为什么使用静态类函数而不是常规函数?
- 模板与常规函数歧义 - UB?
- 如何使用模板生成常规参数列表并将其传递给运行时函数?
- 为什么非放置"新建"和"删除"内置于语言中,而不仅仅是常规函数?
- 是否有任何常规方法可以通知 STL 移动和复制构造函数?
- 使常规函数使用模板包装成员函数
- 如何初始化堆,以便静态构造函数可以在常规 MFC dll 中使用堆?
- Arduino "delay"函数的常规c ++等价物是什么?
- 为什么C++列表初始化也考虑常规构造函数?
- 编译器如何以不同于常规函数的方式处理 lambda?
- 函数模板和常规重载
- C++中的错误处理,构造函数与常规方法
- 函数指针和常规调用的区别
- 使用 boost::this_thread::sleep_for() 和常规睡眠() 函数有什么区别
- 为什么我的函数不跳过尝试解析为不兼容的模板函数,而默认解析为常规函数?
- 指向多值函数的常规指针
- 为什么使用虚函数而不是常规函数