其他分享
首页 > 其他分享> > c – 覆盖非虚拟功能和虚拟功能有什么区别?

c – 覆盖非虚拟功能和虚拟功能有什么区别?

作者:互联网

在C:覆盖非虚拟功能和覆盖虚拟功能有什么区别?

解决方法:

使用虚拟:

class Base {
    virtual void Foo() { std::cout << "Foo in Base" << std::endl;}
};

class Derived : public Base {
    virtual void Foo() { std::cout << "Foo in Derived" << std::endl;}
};

// in main()
Derived* d = new Derived();
d->Foo(); // prints "Foo in Derived"

Base* b = new Derived();
b->Foo(); // prints "Foo in Derived"

没有(相同的代码,但遗漏虚拟):

// in main() 
Derived* d = new Derived();
d->Foo(); // prints "Foo in Derived"

Base* b = new Derived();
b->Foo(); // prints "Foo in Base"

所以区别在于没有虚拟,没有真正的运行时多态性:调用哪个函数是由编译器决定的,具体取决于调用它的指针/引用的当前类型.

对于虚拟,对象维护一个虚函数列表(vtable),在其中查找要调用的函数的实际地址 – 在运行时,每次调用它的虚拟成员时.在此示例中,Derived构造函数隐式修改了Foo的条目以指向重写的函数,因此通过Base-pointer调用Foo并不重要.

标签:c,inheritance,virtual-functions
来源: https://codeday.me/bug/20190726/1543184.html