当前位置:编程学习 > C/C++ >>

C++中的虚继承,virtual你妹呀!--从MicroSoft的思考!

关于这个虚继承,真是挨千刀的家伙,每次遇到笔试题,真是必考呀,你说都不能换个花样吗?真心的容易出错,今天特意来做个总结,让这个挨千刀的家伙,去死去吧!虚函数概念就不多介绍了,主要的作用就是实现多态。先看一段代码:

一、父类不是虚的,你个儿子再虚也不行,还是没你老子坚挺!


[cpp] 
#include <iostream> 
using namespace std; 
 
class A 

public : 
    void find() 
    { 
        cout<<"find::A"<<endl; 
    } 
 
    virtual void get() 
    { 
        cout<<"get::A"<<endl; 
    } 
}; 
 
class B:public A 

    public : 
    void find() 
    { 
        cout<<"find::B"<<endl; 
    } 
 
    virtual void get() 
    { 
        cout<<"get::B"<<endl; 
    } 
}; 
 
int main() 

    A *a=new B(); 
    a->find(); 
    a->get(); 
    return 0; 

大家看上面代码,会输出什么呢?
答案是:

find::A

get::B

假如我们把上面的代码:A中的get()方法去掉virtual关键字,改为一般的函数。结果又是如何的呢?

答案:

find::A

get::A     

这个里面就是发生了虚函数的覆盖问题。

二、小试牛刀

继续看下面代码:

[cpp] 
class A 

public : 
    virtual void get() 
    { 
        cout<<"A"<<endl; 
    } 
}; 
 
class B:public A 

    public : 
 
    virtual void get() 
    { 
        cout<<"B"<<endl; 
    } 
}; 
 
int main() 

    A *pa=new A(); 
    pa->get(); 
    B *pb=(B*)pa; 
    pb->get(); 
 
    delete pa,pb; 
    pa=new B(); 
    pa->get(); 
    pb=(B*)pa; 
    pb->get(); 
    return 0; 

输出: A A B B
以上两个例子都是关于虚函数覆盖虚函数的问题。 B *pb=(B*)pa; 这个我们看到强制转换,但是pa这个指针并没有发生改变,所指向的内容也没有发生改变,所以我们知道pb指向的依然是pa所指向的内容。

delete pa,pb。删除了pa,pb所指向的地址,但是pa,pb并没有被删除,属于悬挂指针。我们重新给pa赋值,指向B,故pa->get();输出了B

 

三、虚继承你知道是啥不!

[cpp]
// MicroTest.cpp : Defines the entry point for the console application. 
// 
 
#include "stdafx.h" 
#include <iostream> 
using namespace std; 
 
class A 

public: 
    void getA() 
    { 
        cout<<"A"; 
    } 
 
    virtual void getAA() 
    { 
        cout<<"1"; 
    } 
}; 
 
class B:public A 

public: 
 
    virtual void getA() 
    { 
        cout<<"B"; 
    } 
 
    virtual void getAA() 
    { 
        cout<<"2"; 
    } 
}; 
 
class C:virtual public A 

public: 
 
    void getA() 
    { 
        cout<<"C"; 
    } 
 
    virtual void getAA() 
    { 
        cout<<"3"; 
    } 
}; 
int main(int argc, char* argv[]) 

    printf("Hello World!\n"); 
    A *a=new B(); 
    A *b=new C(); 
 
    a->getA(); 
    a->getAA(); 
 
    b->getA(); 
    b->getAA(); 
 
    return 0; 

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,