虚函数原理与应用

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

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.==为什么构造函数不能是虚构函数.==

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值