编译时和运行时的虚函数和非虚函数(c++)
Virtual and non-virtual functions during compile-time and runtime (C++)
希望标题没有让人混淆。我试图理解以下问题,从定义类的方法虚或不在c++中出现。假设我有一个基类a和一个派生类B,这样
class A {
public:
void print() { cout << "A"; }
}
class B : A {
public:
void print() { cout << "B"; }
}
如果我知道执行下面的代码,print命令将打印出"A"。
A *a = new A();
B *b = new B();
((A *)b)->print(); // this prints "A"
然而,如果我在两个类中声明"print"方法为虚方法,我将在屏幕上看到一个"B"。为什么会发生这种情况呢?
如果函数不是virtual
,编译器将使用表达式给出的任何类型。因此,当您将B
对象转换为A
对象时,它将调用A::print
函数。
如果你使用virtual
,一个函数指针表[1]是由编译器构建的,当函数被调用时,编译器生成代码通过这个表调用,而不仅仅是查看当前类型,这允许基类型调用派生类中的函数,从而允许多态行为。
A *b = new b ();//LHS是编译时= RHS是运行时(coz' object是在运行时创建的)
如果print是非虚拟的:
编译时:a .print()被解析为去工作(因为它是一个真实的函数)
运行时:a .print()被部署/调度到工作。
如果print是虚函数/非实函数:
编译时:a .print()被绕过,B.print()被解析为继续工作B.print()被部署/分派到工作中。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗