虚函数原理与应用

来源:互联网 发布:生活常识问答软件 编辑:程序博客网 时间:2024/06/16 00:16

虚函数表分析 ==是实现多态的原理==

C++虚函数表剖析 http://blog.csdn.net/lihao21/article/details/50688337

C++ Upcast(向上造型)http://blog.csdn.net/zhang431705/article/details/22106447

动态绑定虚函数,静态绑定非虚函数每个类有一个虚拟表(指针数组,元素是函数指针),在编译阶段赋值

普通虚函数(经常用到)

http://blog.csdn.net/hackbuteer1/article/details/7558868

class A  {  public:      virtual void foo()      {          cout<<"A::foo() is called"<<endl;      }  };  class B:public A  {  public:      void foo()      {          cout<<"B::foo() is called"<<endl;      }  };  int main(void)  {      A *a = new B();      a->foo();   // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的!      return 0;  }  

虚析构

https://baike.baidu.com/item/%E8%99%9A%E6%9E%90%E6%9E%84%E5%87%BD%E6%95%B0/240645?fr=aladdin

http://blog.csdn.net/yapian8/article/details/46418687

http://blog.csdn.net/starlee/article/details/619827

当且仅当类里包含至少一个虚函数的时候才去声明虚析构函数。

class ClxBase{public:    ClxBase() {};    virtual ~ClxBase() {};    virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; };};class ClxDerived : public ClxBase{public:    ClxDerived() {};    ~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; };     void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };};int main(){    ClxBase *pTest = new ClxDerived;    pTest->DoSomething();    delete pTest; //如果没有虚析构只会 ,调用基类ClxBase析构}

纯虚函数

类似其他语言抽象类或接口
1. 类不实例,继承后要么是抽象类,要么实现
2. 定义 virtual int A()=0;

问题

1.==为什么构造函数不能是虚构函数.==

构造函数是在创建对象之前初始化,虚函数是动态绑定运行时指定,每个对象拥有一个虚拟指针,构造函数是对象创建之前调用,虚函数是对象实例后才能调用,前后矛盾.

原创粉丝点击