C 虚拟函数意外行为
C++ virtual functions unexpected behavior
我已经有这个鳕鱼:
class First{
public:
virtual void print(){cout<<"First";}
};
class Second : public First {
public:
virtual void print(){cout<<"Second";}
};
class Third : public Second{
public:
void print(){cout<<"Third";}
int main(){
Third ob;
ob.print();
Second& sec=ob;
sec.print();
First& frs=ob;
frs.print();
}
一切结果正如我所期望的,所有3印刷:"第三"。
现在,因为我有太多代码,并且基本上是相同的,我将在文本中讨论它。
现在,我首先将Virtual删除,并打印出来:"第三个第一个",如我所期望的。
这是第三次,我首先将虚拟放回,但我从第二次将其删除。现在打印:"第三三分之二"。嗯,那不是我所期望的。可以说,当首先使用参考时,它会看到该函数是虚拟的,然后检查对象并调用第三种方法,但是当参考second时,它发现函数不是虚拟的,为什么它仍然会调用第三个print?
如果一个函数覆盖了虚拟函数,那么无论您是否明确声明它是虚拟函数。因此,这里的Second::print
是虚拟的,但是您要声明它。
函数如果将其声明为Vivutal或在任何一个基类中被声明为虚拟的,则将其视为虚拟函数(当通过指针或参考调用时)。
预期在最后一个情况下的行为。您正在使用对第三类的对象的引用。因此,在所有三个呼叫中都调用此类的虚拟函数。您删除了第二类函数的声明,但CVLass首先从类中继承了此功能。它只能覆盖它。
相关文章:
- C++析构函数被意外调用双链表
- 概念解析为使用 std::make_signed_t 时意外的函数模板
- 类中静态函数C++意外结果
- C++意外调用继承类的函数
- 模板函数意外的结果
- 在调用 std::bind 的产品后意外调用析构函数
- C++将派生类的const值传递给基意外行为的构造函数
- 移动构造函数的意外调用
- 使用类/函数模板组合进行意外诊断
- 函数调用中出现意外编译错误 (C++)
- 使用相同的函数时意外收到"std::out_of_range"错误
- 在第三个 pary 函数中使用矢量引用时出现意外错误
- C++ std::find() 寻址返回向量的类函数时的意外行为
- 基于范围的 std::move 调用意外复制构造函数
- 意外输出..函数绑定在虚拟表中的发生方式
- 在 c++ 中使用函数装饰器(使用闭包)时出现意外的分段错误
- C++中出现意外的编译错误:将默认值传递给函数参数
- 是什么导致了构造函数之后的这些"意外令牌"错误?
- 意外缺少隐式声明的复制/移动构造函数
- 在 winapi 回调函数上返回 FALSE 时出现意外行为(循环被跳过?