在C++中:覆盖非虚函数和覆盖虚函数有什么区别?覆盖非虚拟功能和虚拟功能有什么区别?
3
A
回答
8
随着virtual
:
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"
,并没有(相同的代码,但离开了virtual
):
// in main()
Derived* d = new Derived();
d->Foo(); // prints "Foo in Derived"
Base* b = new Derived();
b->Foo(); // prints "Foo in Base"
所以不同的是,没有virtual
,没有真正运行时多态性:其函数的调用由编译器决定,具体取决于调用它的指针/引用的当前类型。
随着virtual
,对象维护一个虚拟函数列表(vtable
),其中它查找要调用的函数的实际地址 - 在运行时,每次调用它的虚拟成员时。在本示例中,Foo
的条目由Derived
构造函数隐式修改为指向覆盖的函数,因此Foo
通过Base
指针被调用并不重要。
0
覆盖虚拟函数将确保在运行时评估对象的类型并调用适当的方法。
实施例:
class Vehicle
{
public:
void PrintType(); // Prints "Vehicle"
};
class Car: public Vehicle
{
// overwrite PrintType to print "Car"
};
// In main
void main()
{
Vehicle *s = new Car();
s->PrintType(); // Prints "Vehicle"
// If PrintType was virtual then the type of s will be evaluated at runtime and the inherited function will be called printing "Car"
}
相关问题
- 1. 覆盖虚拟功能到非虚拟功能可以吗?
- 2. 儿童班的虚拟和非虚拟功能的区别
- 3. 虚拟功能与纯虚拟功能的区别?
- 4. 覆盖和隐藏虚拟功能
- 5. 虚拟功能常量vs虚拟功能非常量
- 6. 虚拟功能
- 7. 虚拟功能
- 8. 具有虚拟和非虚拟功能的unique_ptr :: get()函数
- 9. Overriden虚拟功能
- 10. C++虚拟功能
- 11. 虚拟功能和绕行
- 12. 为什么使用虚拟功能?
- 13. 为什么虚拟功能会隐藏?
- 14. 什么是PHP中的“虚拟()”功能?
- 15. 非虚拟接口 - 如何调用正确的虚拟功能
- 16. 覆盖非虚拟方法?
- 17. 方法覆盖和功能覆盖/超载有什么区别
- 18. 并行和虚拟有什么区别
- 19. 抽象和虚拟有什么区别?
- 20. 要求父虚拟功能
- 21. 优势虚拟功能
- 22. 虚拟功能与回调
- 23. 虚拟功能错误?
- 24. 虚拟功能的超载
- 25. 虚拟功能问题
- 26. 虚拟功能故障
- 27. 虚拟功能输出?
- 28. 功能为虚拟变量
- 29. C++虚拟(密封)功能
- 30. C++虚拟功能无法识别
改写装置无关。你想问关于成员函数隐藏,覆盖或重载吗?如果你想澄清你的问题,在这里搜索每一个。 – 2011-05-03 17:40:00
如果没有人提及它:请参考[The Definitive C++ Book Guide and List](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)并给自己买一个关于C++的好书。 – 2011-05-03 17:42:00