c++ - 虚拟成员函数和非虚拟成员函数的调用方式有何区别?

标签 c++ inheritance

#include<iostream>
using namespace std;
int main(){
    class c1{

        public:
         int func(){
            cout<<"in the  c1";
         }

    };

    class c2:public c1{

        public:
        int func(){
            cout<<" in c2";
        }
    };


c1* a;
c2 b;

a=&b;
a->func();

}

我知道我应该使用虚函数来获得所需的结果,但我想知道上面的代码中发生了什么。即为什么调用 c1::func() 而不是 c2::函数()?

另外请解释当使用 virtual 时会发生什么不同于这种情况。

最佳答案

当成员函数不是时,调用的函数仅由点(.)或箭头(->) 运算符。这称为“静态类型”。

当一个成员函数是时,被调用的函数由点左边的表达式命名的对象的实际最派生类型决定(.)或由箭头左侧的表达式 (->) 指向。这称为“动态类型”。

请注意,当点号左侧使用的变量、成员、参数或返回类型具有普通类类型时,静态类型和动态类型始终相同。但如果变量、成员、参数或返回类型是类类型的指针或引用,则静态类型和动态类型可以不同。

关于c++ - 虚拟成员函数和非虚拟成员函数的调用方式有何区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47026061/

相关文章:

java - 静态方法重写

java - OOM中如何设计这个案例

c++ - 高效读取csv文件的最后一行

c++ - CUDA 零拷贝与 Jetson TK1 上的 CudaMemcpy

c++ - 在链表中实现中性元素

c# - 做继承权

C++11:如何给函数起别名?

python - SWIG C++ 到 Python : generate a subclass of Python list

.net - 什么时候需要接口(interface)?

unit-testing - 单元测试抽象类和/或接口(interface)